如果定义一个类,那如果子类继承了他的话不是可以更加的扩大自己的功能了?为什么还要接口?并且里面还没有具体的方法,还得复写里面的方法。可是为什么还要定义接口?
抱歉,你只要提到“接口与继承”,“单继承多实现”这个概念你就绕不开。但什么是“继承”?其实“继承”一词,包含两层含义(大多数人把它们混着来说):
代码重用(功能扩展)
抽象多态
但“单继承”一词的“继承”,只包含上面第一层含义。事实上,大多数人一提起“继承”,大多数人立马会想起代码重用,但却对抽象多态知之甚少。你要明确,除了“单继承”以外,继承的目的可不仅仅限于代码重用上。有不少的材料会说“JAVA/C#不支持多继承,所以用接口来实现多继承”这句话是一种非常不负责任的说法,因为前后两个“继承”根本不是一个意思。但上面1和2在技术上都依赖一个基本特点:(这也是继承的技术本质)
父类/接口的引用可以指向子类的对象!
代码重用有什么好处,我就不详细叙述了,我下面只谈抽象多态有何用。
你学的是JAVA还是C#?如果是前者,继承用extends/implements,后者用“:”,我下面全部用冒号了。
比如说有某个实体类/工具类,里面有个函数要获取某个图形的面积
class Util
现问题来了,shape类型有很多,不同了图形面积计算方法不一样,如正方形是s=a^2;椭圆面积是s=phai*a*b……那么不同形状图形各整一个类:
class Circle
那么对应的Util类就为这些不同的形状添加F()方法重载?
class Util
那么如果有一百个形状呢?要重载一百个F()函数?一亿个呢?好吧,如果一亿个你都咬牙写了一遍。那么你写好,编译好了成为一个动态库,后面又再增加呢?如果你这个动态库要发布给别人使用,这就逼着别人只能用这几个固定的类而不能随心所欲增加新的类。另外,你要重载一亿个F()函数还得都获得这一亿个类的原型声明。这原型一旦做了修改你又得重新编译,多麻烦?
所以多态就要来解决这个问题了:
有了多态,你只需声明一个接口:
interface IShape
那么使用者只需要让新增加的形状继承于IShape就可以作为参数调用。
class Circle : IShape
class Square: IShape
而抽象类,则是同时兼顾代码重用和抽象多态的折衷产品。
另外,既然你提到过“单继承多实现”,我就不放再说一说,为什么要有“单继承”?
对比JAVA/C#的单继承,C++是多继承的,所以他不需要专门“接口”。多继承,意味着这种语言完全“面向代码重用”(当然他并不排斥抽象多态)。如何为完全“面向代码重用”呢?就是我写一个类,从A继承一票功能,又从B继承一票功能,又从C……,总之,你写的类变成一个大杂烩,万金油。这会有一个逻辑上的不合理:所谓在其位谋其职,分工不明确,将会降低生产效率。
于是以JAVA/C#为代表的标准面向对象模型(面向接口编程),不再允许多继承,而是使用单继承。这意味着你一个类,只能是从属于一个种属/身份,不应该什么都干,什么都能干。类继承不但有代码重用,还起到类型限制的作用。而作为补充,你可以继承多个接口,那么你可以提供超出父类所提供的基本功能,但你不能从现成的拿过来用,而是得自己实现。这保证了你的接口继承紧紧围绕着你的父类所规范的身份转。接口的定义者,则是赋予某种简单功能较为松散的约定,意味着接口所定义的功能,并不与某个类型/身份紧密相连。
简单打个生活中的比方:比如说,你是某家公司的职员,也是驾照的持有者。那么“职员”应当是类或者抽象类,因为你只有具有某公司的职员身份,才有资格进入这家公司工作,而非谁都能去。而“驾照”更应该是接口,因为谁只要没有什么特殊的病或别的,不管具有什么身份,拿到驾照就可上路。
就比如java中的Comparable接口中的ComparTo方法,里面什么也没有,String类的什么的都要实现这个接口,有什么意义?如果我直接在String类中写这个方法不是更好,不好意思,没有开发经验,只是了解了概念!觉得自己理解的不透彻
追答写得太多,超字数了,把回答放在这里,烦请你移步阅读。
http://www.cnblogs.com/CCQLegend/p/3307968.html
就比如java中的Comparable接口中的ComparTo方法,里面什么也没有,String类的什么的都要实现这个接口,有什么意义?如果我直接在String类中写这个方法不是更好,不好意思,没有开发经验,只是了解了概念!觉得自己理解的不透彻
追答这个类不光是string类继承,继承他的多了,只要能进行比较的都会继承该接口,不同类型的类定义的比较意义不同,实现也不同,对于调用者来说都是同一个函数名,同一种接口。。。对于调用者来说只会去关心怎么去调用他,要求调用起来简单最好不同的东西的相似操作有相同的调用方法,就好想开车不同的厂商虽然使用的技术不同(实现方法),但开车都是一种方法,如果每个厂商都各干各的,那你需要学会如何开宝马,如何开奥迪,难道需要每种车型开一个驾驶执照吗??? 继承接口的类都是一个功能的实现者,也就相当于汽车厂商,他们对于怎么开车应该有一个统一的标准,不能你的油门是脚踹的,我的是手按的,接口就是这么一种通用的调用方法,然后需要提供相似功能的类自己去继承接口来实现,对于所有调用者来说这都是一种方便。。。。。。
就比如java中的Comparable接口中的ComparTo方法,里面什么也没有,String类的什么的都要实现这个接口,有什么意义?如果我直接在String类中写这个方法不是更好,不好意思,没有开发经验,只是了解了概念!觉得自己理解的不透彻
Java中继承和接口的区别
理论上:类只能单继承,接口可以多继承(接口应该叫实现);实践上:我们说类的继承一般继承的是事物的属性,如:姓名,年龄,性别 等,而接口的继承(或者说实现)一般是继承事物的行为,如:行走,飞翔,游泳(这比较抽象,在一般项目中大部分是指对某事物的增删改查等操作)总之,单继承描述了“i...
请问java中继承和接口有什么区别?将仔细点,菜鸟。。谢谢了
继承是extended命令,一个类只能继承一个父类,class A extended B,C这种是错误的。继承后,子类可以使用父类的方法。接口是implements命令,一个类可以有很多接口,class A implements B,C,D是可以的。定义了接口之后,子类需要覆写掉接口中的方法,因为接口方法是没有具体实现的。
继承和接口的实现的区别
1、java类可以一次继承多个接口,用implements 接口1,接口2;2如果是接口继承接口的话也可以用extends,接口是多继承的,java类才是单继承;3接口继承接口可以不实现父接口中的方法,可以声明自己的新方法;4类实现接口时,一定要实现接口中声明的方法,如果接口中没有定义抽象方法则不需要,但是要注意,...
Java中继承和接口的区别
1,一个类只能继承一个类,但是可以实现多个接口。2,依赖倒转原则: 依赖抽象(例如接口),不要依赖于实现。3,合成\/聚合复用原则(CARP): 尽量使用合成\/聚合,而不是继承关系达到复用的目的。4,接口传达的意思是:拥有某种功能,能干嘛,比如:Serializable代表可序列化的。5,继承传达的是意思是:...
c#中继承和接口的区别
区别大了。。继承:把两个或多个类的相同属性提取出来~建立父类!接口:在C#里面不可以有变量。只可以有没有实现的方法。然后他要有实现类的。就是实现这个接口的类。。在Java,C#都不允许多继承的。。所谓多继承就是一个子类继承多个父类。。有了接口就间接的实现多继承。。也就是一个类继承一个...
接口、抽象类、实现、继承到底有什么区别?
接口与抽象类的区别:接口比抽象类更简洁、专注,仅包含抽象方法和静态变量,无构造方法、静态代码块和静态方法等,实现都在实现类中完成。抽象类更臃肿,既有抽象方法也有普通方法。接口允许多继承,一个类可以实现多个接口,一个接口也可以继承多个接口。接口更灵活,适用于扩展功能,而继承可能导致功能...
java中继承与实现接口的区别与联系是什么啊?知道的说一下,我这里谢谢了...
继承是子类继承父类的方法,字段等,只能单继承,实现接口是实现父类定义好的一些未实现的方法,然后在子类实现,可以多实现
实现接口和类继承的区别
区别如下:1、使用方面:类在继承抽象类的时候,非abstract方法和属性都继承,同时abstract方法帮忙实现。类在使用接口就像是一个模块化的机器,安上个音频接口,内部就得做个功放功能。设计好之后要按什么接口就得有什么功能。2、结构方面:抽象类的更像是一种树形结构,一个抽象类的范围就是下面的子类...
c#里面的接口和继承好像有些混了,请问它们有什么区别呢?
这个叫多态。从名称上看,接口实现和类继承好像都叫“继承”,但一个是多态,一个是代码重用,几乎是一个问题的两个极端。而抽象类则是介乎两者的折衷,一方面他限制了子类的类型(因为C#只能单继承),重用了自己的代码,另一方面,它多少又定义了一些抽象的方法签名,保证它的子类能提供某种功能。
继承一个类可以实现多个接口吗?
可以的。解释:一个类可以继承一个父类(一个儿子只能有一个父亲)。但是是可以多实现的,也就是实现多个接口,所以题目说的是正确的(java是单继承多实现)。扩展:继承implements,实现接口用extends。接口和抽象类都能描述一般性的公有特征。一般来说,强是关系(strong is-a relationship)清晰地描述...