Tuy nhiên, chữ ký chức năng không phải là luôn giống nhau, do đó có số lượng đối số khác nhau .
Hãy bắt đầu với một vài chức năng được định nghĩa như thế này:
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 bạn:
1) Duy trì kiểu an toàn bằng việc có khách hàng gọi chức năng của bạn trực tiếp.
Đâ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ỡ khỏi mô hình này.
Khi bạn nói về việc muốn chặn các cuộc gọi chức năng, có vẻ như tôi đang cố gắng phát minh lại các chức năng ảo. Có một tải trọng của các cách để có được 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ở một trọng các chức năng của nó.
Nghe có vẻ với tôi như bạn muốn có một lớp đó là nhiều hơn một wrapper hơn một trường hợp có nguồn gốc của một lớp cơ sở, do đó, làm một cái gì đó như thế này:
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 bản đồ đầu vào của các chức năng của bạn vào 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 sẽ làm một số thứ trong một phần của khoảng không quảng cáo của người chơi hoặc 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);
}
}
Đây là thành ngữ tuyệt vời - có thể thay thế câu lệnh chuyển đổi khó chịu. –
Chức năng ví dụ của bạn có các tham số, tuy nhiên, khi bạn gọi hàm được lưu trữ, bạn đang gọi nó mà không có bất kỳ đối số nào. Các đối số có được cố định khi chức năng được lưu trữ không? –
Đó chỉ là một ví dụ kém bằng văn bản của bản thân tôi. Tôi không biết để tạo ra một từ điển mà sẽ làm điều đó, bởi vì chữ ký chức năng luôn luôn khác nhau. – chi