关于接口问题?接口和继承有什么区别,别说单继承多实现。

如果定义一个类,那如果子类继承了他的话不是可以更加的扩大自己的功能了?为什么还要接口?并且里面还没有具体的方法,还得复写里面的方法。可是为什么还要定义接口?

    抱歉,你只要提到“接口与继承”,“单继承多实现”这个概念你就绕不开。但什么是“继承”?其实“继承”一词,包含两层含义(大多数人把它们混着来说):

    代码重用(功能扩展)

    抽象多态

    但“单继承”一词的“继承”,只包含上面第一层含义。事实上,大多数人一提起“继承”,大多数人立马会想起代码重用,但却对抽象多态知之甚少。你要明确,除了“单继承”以外,继承的目的可不仅仅限于代码重用上。有不少的材料会说“JAVA/C#不支持多继承,所以用接口来实现多继承”这句话是一种非常不负责任的说法,因为前后两个“继承”根本不是一个意思。但上面1和2在技术上都依赖一个基本特点:(这也是继承的技术本质)

    父类/接口的引用可以指向子类的对象!


    代码重用有什么好处,我就不详细叙述了,我下面只谈抽象多态有何用。

    你学的是JAVA还是C#?如果是前者,继承用extends/implements,后者用“:”,我下面全部用冒号了。


比如说有某个实体类/工具类,里面有个函数要获取某个图形的面积

class Util
{
    public void F(Shape s)
    {
    ……
    double result=s.CalculateArea();
    ……
    }
}

   


现问题来了,shape类型有很多,不同了图形面积计算方法不一样,如正方形是s=a^2;椭圆面积是s=phai*a*b……那么不同形状图形各整一个类:

class Circle
{
    public doulbe CalculateArea();
}
class Square
{
    public doulbe CalculateArea();
}

   


那么对应的Util类就为这些不同的形状添加F()方法重载?

class Util
{
    public void F(Circle s);
    public void F(Square s);
}

   


那么如果有一百个形状呢?要重载一百个F()函数?一亿个呢?好吧,如果一亿个你都咬牙写了一遍。那么你写好,编译好了成为一个动态库,后面又再增加呢?如果你这个动态库要发布给别人使用,这就逼着别人只能用这几个固定的类而不能随心所欲增加新的类。另外,你要重载一亿个F()函数还得都获得这一亿个类的原型声明。这原型一旦做了修改你又得重新编译,多麻烦?

所以多态就要来解决这个问题了:

有了多态,你只需声明一个接口:

interface IShape
{
    void CalculateArea();
}
class Util
{
    public void F(IShape s)
    {
        ……
        double result=s.CalculateArea();//我Util类管你实现的类是什么类?只要你是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

温馨提示:内容为网友见解,仅供参考
第1个回答  2013-09-07
接口就像现实生活中的插头,你只要声明一个接口,这个接口就可以接到任何一个继承该接口的对象上,来调用该对象中的由接口定义的成员函数,这很方便。。。。不同的类只要有同一种接口,你就能声明一个接口来插在这个对象上使用它的某些成员函数,具体功能可以待定。。。。这就很容易分工合作,比如一个编程员,需要其他几个程序员写个显示程序,他的程序需要使用这些显示其程序,但其他几个程序员分别写的是不同显示器的驱动程序,不同程序员写的肯定不一样,但使用者只想用一种方法调用,那编程者是不是需要先协商一下,定义一个统一的调用标准,确定函数名和参数个数及类型,但不需要商定具体实现,再说不同显示器实现也不同,那这就需要定义一个接口,作为这个标准,由其他实现该程序的程序员去继承,这就是接口的意义,1,便于分工合作提供统一标准,2,便于产品升级。。。
之所以定义接口,是因为大多数语言不支持多重继承,所有类都只有一个爹,父类写成纯虚类当接口用,那也只能有一个接口,但实际当中一个对象可能有N个不同类型的接口,由N个其他程序和他完成连接,并使用。。。那就需要继承N个接口,但靠类继承只能继承一个,就没办法实现,所以就出现了接口这种东西,可实现纯虚类的多重继承。。。。追问

就比如java中的Comparable接口中的ComparTo方法,里面什么也没有,String类的什么的都要实现这个接口,有什么意义?如果我直接在String类中写这个方法不是更好,不好意思,没有开发经验,只是了解了概念!觉得自己理解的不透彻

追答

这个类不光是string类继承,继承他的多了,只要能进行比较的都会继承该接口,不同类型的类定义的比较意义不同,实现也不同,对于调用者来说都是同一个函数名,同一种接口。。。对于调用者来说只会去关心怎么去调用他,要求调用起来简单最好不同的东西的相似操作有相同的调用方法,就好想开车不同的厂商虽然使用的技术不同(实现方法),但开车都是一种方法,如果每个厂商都各干各的,那你需要学会如何开宝马,如何开奥迪,难道需要每种车型开一个驾驶执照吗??? 继承接口的类都是一个功能的实现者,也就相当于汽车厂商,他们对于怎么开车应该有一个统一的标准,不能你的油门是脚踹的,我的是手按的,接口就是这么一种通用的调用方法,然后需要提供相似功能的类自己去继承接口来实现,对于所有调用者来说这都是一种方便。。。。。。

第2个回答  2013-09-06
接口提供约束。例如如果函数中要使用一个容器,容器必须要有insert、size等等方法,但在写函数时不知道容器的具体定义,定义容器时可能又看不到函数需要什么(可能函数和容器是不同的人编写的,而写代码的人不希望别人知道具体的实现细节),但只要函数说明了“这个容器必须实现指定的接口”,并且容器定义时能看到这个接口,就不会造成问题……追问

就比如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)清晰地描述...

相似回答