อย่างไรก็ตามลายเซ็นของฟังก์ชันจะไม่เหมือนกันเสมอไปดังนั้นจึงมีจำนวนอาร์กิวเมนต์ที่แตกต่างกัน
เริ่มต้นด้วยฟังก์ชั่นบางอย่างที่กำหนดไว้ดังนี้:
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);
}
}