Bununla birlikte, işlev imzası her zaman aynı değildir, bu nedenle farklı miktarda argüman içerir.
Bunun gibi tanımlanan birkaç işlevle başlayalım:
private object Function1() { return null; }
private object Function2(object arg1) { return null; }
private object Function3(object arg1, object arg3) { return null; }
Gerçekten elinizin altında 2 geçerli seçeneğiniz var:
1) İstemcilerin işlevinizi doğrudan aramasını sağlayarak tür güvenliğini sağlayın.
Bu modelden kopmak için çok iyi nedenleriniz yoksa, muhtemelen en iyi çözüm budur .
İşlev çağrılarını durdurmaktan bahsettiğinizde, bana sanal işlevleri yeniden icat etmeye çalışıyormuşsunuz gibi geliyor. Bir temel sınıftan miras almak ve işlevlerini geçersiz kılmak gibi, bu tür bir işlevselliği kutudan çıkarmanın birçok yolu vardır.
Bana öyle geliyor ki , temel sınıfın türetilmiş bir örneğinden çok bir sarmalayıcı olan bir sınıf istiyorsun , öyleyse şöyle bir şey yap:
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) VEYA işlevlerinizin girişini ortak bir arayüzle eşleyin.
Tüm işlevleriniz birbiriyle ilişkiliyse bu işe yarayabilir. Örneğin, bir oyun yazıyorsanız ve tüm işlevler, oyuncunun veya oyuncunun envanterinin bir kısmına bir şeyler yapıyor. Bunun gibi bir şeye sahip olacaksın:
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);
}
}