그러나 함수 시그니처가 항상 동일한 것은 아니므로 인수의 양이 다릅니다.
다음과 같이 정의 된 몇 가지 함수부터 시작하겠습니다.
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);
}
}