假设我们有:
interface Foo { bool Func(int x); } class Bar: Foo { bool Func(int x) { return (x>0); } } class Baz: Foo { bool Func(int x) { return (x<0); } }
现在我们可以将Bar和Baz作为Foos折腾并调用他们的Func方法.
代表们对此进行了简化:
delegate bool Foo(int x); bool Bar(int x) { return (x<0); } bool Baz(int x) { return (x>0); }
现在我们可以作为Foo代表折腾Bar和Baz.
除了获得更短的代码之外,代表们的真正好处是什么?
稍有不同,委托可以访问定义它们的类的成员变量.在C#中(与Java不同),所有内部类都被认为是静态的.因此,如果您使用接口来管理回调,例如按钮的ActionListener.实现内部类需要传递(通过构造函数)对回调期间可能需要与之交互的包含类的部分的引用.代表没有此限制因此减少了实现回调所需的代码量.
更简洁,更简洁的代码也是值得的.
从软件工程的角度来看,你是对的,委托很像函数接口,因为它们是函数接口的原型.
它们也可以以相同的方式使用:不是传递包含您需要的方法的整个类,而是只传递一个委托.这样可以节省大量代码并创建更易读的代码.
此外,随着lambda表达式的出现,它们现在也可以在飞行中轻松定义,这是一个巨大的奖励.虽然在C#中动态构建类是可能的,但它确实是一个巨大的痛苦.
比较两者是一个有趣的概念.我之前没有考虑过用例和代码结构的观点有多大相似之处.