请问C#既然有接口了,为什么还要委托呢?

时间:2022-08-27 18:33:37
有个问题,我一直不懂,C#既然有接口了,为什么还要委托呢?委托有什么优势呢(实质点的)?谢谢!

9 个解决方案

#1


up

#2


委托简单来讲就是对方法的描述,主要用于事件处理.
接口是对类的描述,主要用于类的继承.

#3


委托是面向对象、类型安全的。委托声明定义一种类型,它用一组特定的参数以及返回类型封装方法。对于静态方法,委托对象封装要调用的方法。对于实例方法,委托对象同时封装一个实例和该实例上的一个方法。如果有一个委托对象和一组适当的参数,则可以用这些参数调用该委托。
委托和接口的类似之处是,它们都允许分隔规范和实现。多个独立的作者可以生成与一个接口规范兼容的多个实现。类似地,委托指定方法的签名,多个作者可以编写与委托规范兼容的多个方法。

委托在以下情况下很有用:

调用单个方法。 
一个类可能希望有方法规范的多个实现。 
希望允许使用静态方法实现规范。 
希望类似事件的设计模式。 
调用方不需要知道或获得在其上定义方法的对象。 
实现的提供程序希望只对少数选择组件“分发”规范实现。 
需要方便的组合。
 
接口在以下情况下很有用:

规范定义将调用的一组相关方法。 
类通常只实现规范一次。 
接口的调用方希望转换为接口类型或从接口类型转换,以获得其他接口或类。

#4


to wxy0401(abc) 
可能我表达不清楚吧,个人感觉用interface作事件处理似乎更简洁明了和OO。

to maliang00111
这些我也看过,可是有些还是不懂。比如1,4条似乎interface作的也很好啊,2,3,5有什么明显优势、意义吗?怎么感觉有点华而不实呢?6,7能举例说明一下吗?

谢谢!

#5


楼主还没有入门。

#6


to bbdog(贝贝狗)
我确实没入门
你能给些需要用到delegate而interface不能作的东西吗?谢谢!最好是比较实际点的。

#7


A.DLL定义的一个方法,B.DLL定义一个委托,C.EXE同时引用了A.DLL和B.DLL,则可以把A.DLL中的这个方法按B.DLL定义的委托去调用.而A.DLL没有必要直接引用B.DLL,如果有一天C.EXE想升级的话,可能用D.DLL去替掉A.DLL,而实现新的功能

以上要求如果用接口去实现的话,A.DLL必须要引用B.DLL才可以实现,现实中A.DLL和B.DLL和C.EXE不一定必须是一个厂家的产品,A.DLL的开发商可能根本不知道B.DLL的存在,也不知道C.Exe会如何使用自己.

#8


1.指针变量有两种
第一种.类指针
-------------------------
class a{} 
a obj =new a();
//obj 是类指针
-------------------------
第二种.函数指针
-------------------------
delegate void b(int v);

void f(int v){};

b obj=new b(f);
//obj 是函数指针
-------------------------
2.事件就是委托多了个event关键字,你将event去掉,代码不会报错

3.接口是定义类时必须要定义的,不过在C#中,你不定义编译器帮你做了

4.接口是初始化"栈"的模板,"类实体"是初始化"堆"的模板

5.一个类指针由一组"函数指针"与"类指针组成"

6.委托就是函数指针,是面向对象内存实现的基石

#9


非常感谢jointan,wxwinter的帮助,呵呵 

#1


up

#2


委托简单来讲就是对方法的描述,主要用于事件处理.
接口是对类的描述,主要用于类的继承.

#3


委托是面向对象、类型安全的。委托声明定义一种类型,它用一组特定的参数以及返回类型封装方法。对于静态方法,委托对象封装要调用的方法。对于实例方法,委托对象同时封装一个实例和该实例上的一个方法。如果有一个委托对象和一组适当的参数,则可以用这些参数调用该委托。
委托和接口的类似之处是,它们都允许分隔规范和实现。多个独立的作者可以生成与一个接口规范兼容的多个实现。类似地,委托指定方法的签名,多个作者可以编写与委托规范兼容的多个方法。

委托在以下情况下很有用:

调用单个方法。 
一个类可能希望有方法规范的多个实现。 
希望允许使用静态方法实现规范。 
希望类似事件的设计模式。 
调用方不需要知道或获得在其上定义方法的对象。 
实现的提供程序希望只对少数选择组件“分发”规范实现。 
需要方便的组合。
 
接口在以下情况下很有用:

规范定义将调用的一组相关方法。 
类通常只实现规范一次。 
接口的调用方希望转换为接口类型或从接口类型转换,以获得其他接口或类。

#4


to wxy0401(abc) 
可能我表达不清楚吧,个人感觉用interface作事件处理似乎更简洁明了和OO。

to maliang00111
这些我也看过,可是有些还是不懂。比如1,4条似乎interface作的也很好啊,2,3,5有什么明显优势、意义吗?怎么感觉有点华而不实呢?6,7能举例说明一下吗?

谢谢!

#5


楼主还没有入门。

#6


to bbdog(贝贝狗)
我确实没入门
你能给些需要用到delegate而interface不能作的东西吗?谢谢!最好是比较实际点的。

#7


A.DLL定义的一个方法,B.DLL定义一个委托,C.EXE同时引用了A.DLL和B.DLL,则可以把A.DLL中的这个方法按B.DLL定义的委托去调用.而A.DLL没有必要直接引用B.DLL,如果有一天C.EXE想升级的话,可能用D.DLL去替掉A.DLL,而实现新的功能

以上要求如果用接口去实现的话,A.DLL必须要引用B.DLL才可以实现,现实中A.DLL和B.DLL和C.EXE不一定必须是一个厂家的产品,A.DLL的开发商可能根本不知道B.DLL的存在,也不知道C.Exe会如何使用自己.

#8


1.指针变量有两种
第一种.类指针
-------------------------
class a{} 
a obj =new a();
//obj 是类指针
-------------------------
第二种.函数指针
-------------------------
delegate void b(int v);

void f(int v){};

b obj=new b(f);
//obj 是函数指针
-------------------------
2.事件就是委托多了个event关键字,你将event去掉,代码不会报错

3.接口是定义类时必须要定义的,不过在C#中,你不定义编译器帮你做了

4.接口是初始化"栈"的模板,"类实体"是初始化"堆"的模板

5.一个类指针由一组"函数指针"与"类指针组成"

6.委托就是函数指针,是面向对象内存实现的基石

#9


非常感谢jointan,wxwinter的帮助,呵呵