Namun, tanda tangan fungsi tidak selalu sama, sehingga memiliki jumlah argumen yang berbeda.
Mari kita mulai dengan beberapa fungsi yang didefinisikan seperti ini:
private object Function1() { return null; }
private object Function2(object arg1) { return null; }
private object Function3(object arg1, object arg3) { return null; }
Anda benar-benar memiliki 2 opsi yang dapat Anda gunakan:
1) Pertahankan keamanan tipe dengan meminta klien memanggil fungsi Anda secara langsung.
Ini mungkin solusi terbaik, kecuali Anda memiliki alasan yang sangat kuat untuk keluar dari model ini.
Ketika Anda berbicara tentang ingin mencegat panggilan fungsi, bagi saya kedengarannya seperti Anda mencoba menciptakan kembali fungsi virtual. Ada banyak sekali cara untuk mengeluarkan fungsionalitas semacam ini, seperti mewarisi dari kelas dasar dan menimpa fungsinya.
Kedengarannya bagi saya seperti Anda menginginkan kelas yang lebih merupakan pembungkus daripada turunan turunan dari kelas dasar, jadi lakukan sesuatu seperti ini:
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) ATAU petakan input fungsi Anda ke antarmuka umum.
Ini mungkin berfungsi jika semua fungsi Anda terkait. Misalnya, jika Anda sedang menulis game, dan semua fungsi melakukan sesuatu pada beberapa bagian dari pemain atau inventaris pemain. Anda akan berakhir dengan sesuatu seperti ini:
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);
}
}