关于C#:我如何使用具有委托的类

How EXACTLY do I use a class that has a delegate in it

本问题已经有最佳答案,请猛点这里访问。

本质上,我要问的是,什么是代表,但我到底该如何使用代表?

委托的逻辑流程是什么?我需要很好的解释,所以我在这个网站上的许多谷歌搜索和搜索都揭示了它们的用途,但并不是真正的如何使用它们。

我有一个在中有委托的类,您可以调用的函数要求委托作为参数。我应该做什么,在我的类中构造一个重复的委托,传递它,然后它们被链接?对于那些愚蠢的人来说,一些真正基本的解释是值得赞赏的!

谢谢您!


委托是在一个类中组合在一起的一组回调函数。为了帮助您理解,假设此方法签名:

1
-[Foo doStuffWithInteger:(int)foo thenExecute:void (^block)(Foo*)]

(你知道街区,对吧?)文档会告诉我们,一旦方法的主要算法完成,它将回调(执行)传递的块。

委托模式比较旧,并且做的事情略有不同。对于委托模式,Foo类将使用这两种方法:

1
2
-[Foo setDelegate:(id)delegate]
-[Foo doStuffWithInteger:(int)foo]

Foo对象不是在doStuffWithInteger的末尾调用块,而是在委托上调用一个方法。这意味着委托必须实现-[??? foo:(Foo*) completedStuffWithInteger:(int)]类能够使用的某种方法。所有需要回调的方法都可能对委托调用不同的方法。

Objective-C中的委托通常允许您实现类的自定义行为,而不必对它们进行子类化。例如,CALayer的委托可以实现draw:inContext:方法,该方法在需要绘制层时调用,并向层提供内容。

由于objective-c是duck类型的,所以可以使用实现委托方法的任何类。


委托接收来自其他"委托"对象的消息,并对其进行操作。

UITableView为例。它有一个UITableViewDelegate,在这里它询问另一个对象如何对某些事情(例如行高)进行操作。


基本上,委托是类型ID的变量,这些变量称为"耦合",它与一个非常类似Java或C接口的协议无关,除非协议可以指定不需要实现的可选方法。

因此,为了使用一个类,委托将实现如下协议:

1
2
3
4
5
6
7
8
9
10
.h file:

MyClass <TheProtocol>

.m file

- (void)theMethodToImplement
{
 //The implementation
}

之后,通常需要像这样设置具有委托变量的类:

1
theDelegateClass.delegate = self;

在此之后,"委托类"可以对其他类调用实现的方法,如下所示:

1
[delegate theMethodToImplement];

对于任何不低于关键字@optional的方法,都可以安全地执行此操作;对于在关键字@optional下面声明的协议中的方法,应首先检查委托是否决定执行此方法:

1
2
if ([delegate respondsToSelector:@selector(theOptionalMethod)])
[delegate theOptionalMethod];