C# 接口与类的作用的区别,什么时候该用接口,什么时候改用类。比如,不用知道具体的子类是什么,调用通用的接口,这个用基类实现也行,用接口实现也行 PS:这里不用讨论基本概念,想从最能突出各自作用的一些点做更深刻的说明。
博客园应该多一些这样的问题,而不是那些”怎么做一个控制系统的软件“”怎么做一个木马“”怎么做一个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的子类(注意,这种关系不是接口特有的,而是所有的承继关系都有,子类可以当成父类用)。
简单的说吧,最关键的问题是c#基类的继承只能是子类继承于一个父类,但一个类确可以被多个接口约束(即可以实现多个接口),打个比方: 飞机应该是机器的子类;鸟应该是动物的子类,这没问题,那么如何体现出它们都会飞呢?这个时候就定义一个IFlyable的接口,那么飞机和鸟都去实现这个接口,下一步我再设计其他类的时候只需要针对IFlyable接口设计,管你传过来的是飞机还是鸟只要能飞就能被复用。
这个例子不错
接口是一种协议,类是包含了协议的实现。举个通俗的例子:
国家说我们的分配原则是:多劳多得。这个就是个接口。定义了一个接口:
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接口来做,国家表示:不合法,编译不通过。
典型应用如:很多编程语言的数据库接口。数据库无数种,编程语言不可能自己去实现所有的数据库接口实现,于是他们就写个接口,规定你至少要提供哪些方法,巴拉巴拉。
类是实现,接口是抽象,抽象的东西在现实生活中是不存在的,存在的是类.所以什么时候用类,什么时候用接口,要看你如何去抽象具体的事物.
接口相当于制造”工具的模型”,如:可以在接口中声明一些方法,和属性等;在类中你可以通过实现接口来制造一些“具体的工具”,即在“重写的方法中编写具体的代码来实现你要的功能”;也可以笼统的将接口理解为是一些要实现接口的类的父类;
你多写几遍就能慢慢理解了,不要着急