Tuy nhiên, chữ ký hàm không phải lúc nào cũng giống nhau, do đó có số lượng đối số khác nhau.
Hãy bắt đầu với một vài hàm được định nghĩa như sau:
private object Function1() { return null; }
private object Function2(object arg1) { return null; }
private object Function3(object arg1, object arg3) { return null; }
Bạn thực sự có 2 lựa chọn khả thi theo ý của mình:
1) Duy trì an toàn kiểu bằng cách để khách hàng gọi trực tiếp cho chức năng của bạn.
Đây có lẽ là giải pháp tốt nhất, trừ khi bạn có rất lý do chính đáng để phá vỡ từ mô hình này.
Khi bạn nói về việc muốn chặn các lệnh gọi hàm, tôi nghe có vẻ như bạn đang cố gắng phát minh lại các hàm ảo. Có rất nhiều cách để lấy loại chức năng này ra khỏi hộp, chẳng hạn như kế thừa từ một lớp cơ sở và ghi đè các chức năng của nó.
Đối với tôi, có vẻ như bạn muốn một lớp giống như một trình bao bọc hơn là một thể hiện dẫn xuất của một lớp cơ sở, vì vậy hãy làm như sau:
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) HOẶC ánh xạ đầu vào của các chức năng của bạn với một giao diện chung.
Điều này có thể hoạt động nếu tất cả các chức năng của bạn có liên quan. Ví dụ: nếu bạn đang viết một trò chơi và tất cả các chức năng đều tác động đến một số phần của trình phát hoặc kho của người chơi. Bạn sẽ kết thúc với một cái gì đó như thế này:
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);
}
}