根据您的需要,您可以做两种不同的事情:
您可以创建一个包含委托的变量(变量类型将是所述委托的)。当您希望能够在对象之外实现功能时,您通常会这样做。你也可以使用这个东西返回一个值,这样你就可以用它来改变对象的状态。
您可以创建一个事件。当您希望能够防止某些对象在您的对象中发生某些事情时,您会这样做:您触发一个事件。您的对象根本不应该知道之后发生的事情。这通常是您在实现 View 时所做的,您会触发一些事件,以便 Controller 可以知道 View 中发生了什么。然后他可以决定之后如何处理视图。
第一个例子,名称检索没有在控制器中定义,它必须由外部设置。控制器不知道它是如何工作的,但它想检索一个整数 id 的名称。它的工作方式与接口相同:
public class MyController {
private NameForIDFetcher NameFetcher { get; set; }
private List<int> _ids = new List<int>();
public delegate string NameForIDFetcher(int id);
public void showNames() {
if (this.NameFetcher == null) {
throw new Exception("No NameFetcher set.");
}
foreach (int id in this._ids) {
Console.WriteLine(id + ": " + this.NameFetcher(id));
}
}
}
第二个例子,当视图出现和消失时,视图可以阻止所有可能连接到事件的监听器。如果没有人连接,视图不应该改变它的行为(如果有人知道它应该的情况,请告诉我)。你可以注意到我第二次使用了 Action,它是一个通用的委托,它返回 void 并采用你在参数中提供的模板。您最多可以有 16 个模板参数,这意味着委托将采用 16 个参数,但这将是一个非常讨厌的委托,不是吗?
public class MyView {
public event ViewAction onViewAppeared;
public event Action<MyView> onViewDisappeared;
public delegate void ViewAction(MyView view);
public void show() {
// Stuffs
if (this.onViewAppeared != null) {
this.onViewAppeared(this);
}
}
public void hide() {
// Stufs
if (this.onViewDisappeared != null) {
this.onViewDisappeared(this);
}
}
}