首页 新闻 会员 周边

C# 接口 与 类的 区别

0
悬赏园豆:5 [已解决问题] 解决于 2018-05-26 18:37

C# 接口与类的作用的区别,什么时候该用接口,什么时候改用类。比如,不用知道具体的子类是什么,调用通用的接口,这个用基类实现也行,用接口实现也行 PS:这里不用讨论基本概念,想从最能突出各自作用的一些点做更深刻的说明。

Ellco的主页 Ellco | 初学一级 | 园豆:166
提问于:2015-12-23 18:58
< >
分享
最佳答案
0

博客园应该多一些这样的问题,而不是那些”怎么做一个控制系统的软件“”怎么做一个木马“”怎么做一个Falcon 9"之类的。

说接口和类的区别,应该先说是什么原因迫使它们出现,这样更容易理解。

类的出现是为了封装数据,因为以前只有简单的基本数据类型,很难描述现实世界,后来演生出结构体,是类的雏形。再后来,发现两个极为相似的东西就因为一个小地方不同就要做两个结构体,而且其之间转换不了,所以,为了让类型与类型之间能够有关系,发明了面向对象,就出现了子类与父类这种关系。而此时,一个子类继承多个父类是可以被允许的,因此,为了继承多个并非是接口出现的原因。在此,应该先说父类。父类接着出现了好多种,有的父类自己不想做实现,只想强制要求自己的子类有某些功能。比如,Bird类,它只要求子类实现Fly方法,但是,不同的子类(鸟)飞的方式不一样,所以,它又不能先实现一种方式。这个时候就出现了虚方法,也就是说,Fly这个方法虽然在父类中声明了,但是,子类必须重新实现它。再后来,大家发现,既然Bird无法决定所有鸟的Fly方式,那么它凭什么决定所有鸟的Fuck方式呢?所以,索性把Bird的所有方法都改为虚方法得了。让Bird不能被直接使用,要用只能用那些子类。这种情况下,就索性直接Bird写成虚类了。好了,这个虚类出现了,其实接口是一种特殊的虚类。在cpp里面,其实我并末发现虚类和接口在使用上的区别,而事实上,程序员也是这么用的,就是,能用接口的地方有时候就直接用虚类,能用虚类的地方有时候直接用接口。但是,java和c#就不一样了,这类新的语言发现,当一个子类继承多个基类的时候,如果基类中恰好有相同的方法,那么就坑爹了……为了杜绝这种情况,它们禁止继承多个基类(其实说它是父类是有原因的,不可能一个孩子有两个爹一个妈……),而接口没有具体的实现,继承多个基类中有相同的方法不会产生冲突。比如,A类说Fly是竖着飞,B类说Fly是横着飞,C承继他们俩的时候就蛋疼了,到底要怎么飞,这种逻辑上的问题谁都解决不了。接口IA说子类必须有Fly这个方法用来飞。接口IB说子类必须有Fly这个方法用来飞,C继承了IA和IB,自己想怎么飞就怎么飞,一点都不冲突了。所以,接口就是这么出现的。以至于后来,接口成了实现了它的类的一种说明。但其实真正的用法是在写消费代码的时候用得多。消费代码里面的参数通过越广泛越好,越具体反而使得方法的使用范围受到限制。比如杀鸟这个方法Kill(Sparrow sp)这种情况下,你只能杀一只麻雀是不是?但是,你想杀的是所有会飞的东西,那么,你如果这样使用Kill(IBird bird)就可以了,sp也可以传入IBird类型的形参中的,只要它是IBird的子类(注意,这种关系不是接口特有的,而是所有的承继关系都有,子类可以当成父类用)。

收获园豆:5
ensleep | 小虾三级 |园豆:1682 | 2015-12-24 09:31
其他回答(4)
0

简单的说吧,最关键的问题是c#基类的继承只能是子类继承于一个父类,但一个类确可以被多个接口约束(即可以实现多个接口),打个比方: 飞机应该是机器的子类;鸟应该是动物的子类,这没问题,那么如何体现出它们都会飞呢?这个时候就定义一个IFlyable的接口,那么飞机和鸟都去实现这个接口,下一步我再设计其他类的时候只需要针对IFlyable接口设计,管你传过来的是飞机还是鸟只要能飞就能被复用。

为森 | 园豆:579 (小虾三级) | 2015-12-23 19:32

这个例子不错

支持(0) 反对(0) Ellco | 园豆:166 (初学一级) | 2015-12-23 19:33
0

接口是一种协议,类是包含了协议的实现。举个通俗的例子:

国家说我们的分配原则是:多劳多得。这个就是个接口。定义了一个接口:

interface Income()

{

    int salary(int work);

}

但是怎么算多劳?怎么算多得?国家表示不知道,由各个企业自己去搞定,他只管原则性问题。于是CMCC公司决定来implements这个接口

class CMCC implements Income

{

    public int salary(int work)    {

        return work * 20; //20元每小时

    }

}

另一家叫KFC的公司说,干1小时10元。

class KFC implements Income

{

    public int salary(int work)    {

        return work * 10; //10元每小时

    }

}

当然M家也可能有别的implement的算法,但是如果不是按照国家规定的Income接口来做,国家表示:不合法,编译不通过。

典型应用如:很多编程语言的数据库接口。数据库无数种,编程语言不可能自己去实现所有的数据库接口实现,于是他们就写个接口,规定你至少要提供哪些方法,巴拉巴拉。

酱油能 | 园豆:386 (菜鸟二级) | 2015-12-24 10:56
0

类是实现,接口是抽象,抽象的东西在现实生活中是不存在的,存在的是类.所以什么时候用类,什么时候用接口,要看你如何去抽象具体的事物.

水晶途途 | 园豆:1443 (小虾三级) | 2015-12-24 10:58
0

接口相当于制造”工具的模型”,如:可以在接口中声明一些方法,和属性等;在类中你可以通过实现接口来制造一些“具体的工具”,即在“重写的方法中编写具体的代码来实现你要的功能”;也可以笼统的将接口理解为是一些要实现接口的类的父类;

  你多写几遍就能慢慢理解了,不要着急

猿进化 | 园豆:174 (初学一级) | 2015-12-27 15:45
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册