ただし、関数のシグネチャは常に同じではないため、引数の数が異なります。
このように定義されたいくつかの関数から始めましょう:
private object Function1() { return null; }
private object Function2(object arg1) { return null; }
private object Function3(object arg1, object arg3) { return null; }
あなたは本当にあなたの処分で2つの実行可能なオプションを持っています:
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);
}
}