委托与接口的关系
约束和约定的关系:
1,约束的哲学是你继承什么(约束)你就是什么。约定的哲学是你能做什么(满足什么约定)你就是什么。
2,约定比约束要灵活。
一则招聘信息:提到“本科学位”是一种约束。一个实现了“I国家认可本科毕业”接口的的学位证书才是本科学位,即符合该招聘的约束。
另一则招聘信息:提到“英语六级水平相当”是一种约定,一个没有大学文凭却达到英语六级水平的应聘者都符合这个招聘约定。
所以约定比约束更容易被满足,因此实现起来更灵活和方便。
委托和接口的关系:
接口:是对象的约束。
委托:即是方法的约束,又是方法的约定。
1,它们都能将规范(specification)与实现(implementation)在代码上分开,以此实现代码的灵活性和可重用性。(这是OOP最重要的抽象机制之一,如果认识不到这一点,说明对OOP的理解还停留在表面的语法上)
2,在定义的时候委托与接口一样要体现约束信息,而在使用的时候委托是灵活的只要符合约定即可。
举例,一个记日志的委托分离了日志实现,a.Logging = 某个委托。任何传入参数类型为string、返回void的委托都能出现在上式的右边,这体现了委托作为方法的约定。但是任何传入参数类型不为string或者返回值不是void的委托都不能出现在上市右边,这体现了委托作为方法的约束。
3,委托比接口更灵活和更方便的地方有:实现类型是匿名的,方法是匿名的,方法可以是静态的,方法还可以复合等等。但委托能做的事接口都能做,只是麻烦一些,接口能做的委托却不一定能做。比如委托不能包含两个以上的不同规范的方法,也不能定义子类型等等。
再说委托:
委托拥有C和C++中的函数指针的血缘。在.net时代,微软把委托改造成了既不失灵活性又增加了语法上的规范性,这样一个“函数指针”。
接口和委托,他们的级别完全不一样,用法就更不一样了。他们各有优势没有高下,如果说委托是点的标准,那么接口就是面的标准。
题外话:
约束有强弱之分。越强的约束越安全,静态性越强,受编译器的支持越大(c#就是);反之,越弱的约束,动态性越强,运行时灵活性越大(动态语言)。