যাইহোক, ফাংশন স্বাক্ষর সবসময় এক রকম হয় না, এভাবে বিভিন্ন পরিমাণ যুক্তিযুক্ত থাকে।
এর মতো সংজ্ঞায়িত কয়েকটি ফাংশন দিয়ে শুরু করা যাক:
private object Function1() { return null; }
private object Function2(object arg1) { return null; }
private object Function3(object arg1, object arg3) { return null; }
আপনার কাছে সত্যিই আপনার কাছে দুটি কার্যকর বিকল্প রয়েছে:
1) ক্লায়েন্টদের সরাসরি আপনার ফাংশনটিতে কল করে প্রকার সুরক্ষা বজায় রাখুন।
এটি সম্ভবত সেরা সমাধান, যদি না আপনি এই মডেল থেকে বিরতি জন্য খুব ভাল কারণ আছে ।
আপনি যখন ফাংশন কলগুলিতে বাধা দেওয়ার কথা বলছেন তখন আমার কাছে মনে হয় আপনি ভার্চুয়াল ফাংশনগুলি পুনরায় উদ্ভাবনের চেষ্টা করছেন। এই ধরণের কার্যকারিতাটি বাক্স থেকে বের করার জন্য একটি নৌকা বোঝা রয়েছে যেমন একটি বেস শ্রেণীর উত্তরাধিকার সূত্রে এর কার্যকারিতা ওভাররাইড করা।
আমার কাছে মনে হচ্ছে আপনি এমন একটি ক্লাস চান যা একটি বেস ক্লাসের উত্পন্ন উদাহরণের চেয়ে বেশি মোড়কের চেয়ে বেশি, তাই এরকম কিছু করুন:
public interface IMyObject
{
object Function1();
object Function2(object arg1);
object Function3(object arg1, object arg2);
}
class MyObject : IMyObject
{
public object Function1() { return null; }
public object Function2(object arg1) { return null; }
public object Function3(object arg1, object arg2) { return null; }
}
class MyObjectInterceptor : IMyObject
{
readonly IMyObject MyObject;
public MyObjectInterceptor()
: this(new MyObject())
{
}
public MyObjectInterceptor(IMyObject myObject)
{
MyObject = myObject;
}
public object Function1()
{
Console.WriteLine("Intercepted Function1");
return MyObject.Function1();
}
public object Function2(object arg1)
{
Console.WriteLine("Intercepted Function2");
return MyObject.Function2(arg1);
}
public object Function3(object arg1, object arg2)
{
Console.WriteLine("Intercepted Function3");
return MyObject.Function3(arg1, arg2);
}
}
2) অথবা আপনার ফাংশনগুলির ইনপুটটিকে একটি সাধারণ ইন্টারফেসে মানচিত্র করুন।
আপনার সমস্ত ফাংশন সম্পর্কিত হলে এটি কাজ করতে পারে। উদাহরণস্বরূপ, আপনি যদি একটি গেম লিখছেন, এবং সমস্ত ফাংশন প্লেয়ার বা প্লেয়ারের জায়টির কিছু অংশকে কিছু করে। আপনি এরকম কিছু দিয়ে শেষ করতে চাইবেন:
class Interceptor
{
private object function1() { return null; }
private object function2(object arg1) { return null; }
private object function3(object arg1, object arg3) { return null; }
Dictionary<string, Func<State, object>> functions;
public Interceptor()
{
functions = new Dictionary<string, Func<State, object>>();
functions.Add("function1", state => function1());
functions.Add("function2", state => function2(state.arg1, state.arg2));
functions.Add("function3", state => function3(state.arg1, state.are2, state.arg3));
}
public object Invoke(string key, object state)
{
Func<object, object> func = functions[key];
return func(state);
}
}