interface ILogger { void Write(string msg); }
class A {
ILogger Logger { get; set; }
void F() {}
}
class B {
void G() {
A a = new A();
a.Logger = new LogAdapter(); // 注入相依
a.F();
}
}
// 包裝第三方 Logger
class LogAdapter : ILogger {
void Write(string msg) { /* 呼叫第三方 Logger */ }
}
class A {
Action<string> Logging { get; set; }
void F() {}
}
class B {
void G() {
A a = new A();
a.Logging = delegate(string msg) { /* 呼叫第三方 Logger */ };
a.F();
}
}
委派約束比介面弱得多、靈活得多。介面實作需額外建立 Adapter 機械適應型別約束;委派僅需符合方法簽名即可。
Duck Typing、泛型委派妙用、運算式樹與 lambda、.NET 4.0 動態程式設計,敬請期待。