接口与抽象类

    技术2022-05-11  45

    接口与抽象类的区别1 接口可以多重继承,但是抽象类不可以;   接口为了实现系统中的松偶合度.2 抽象类与子类,是父子关系; 而接口则不是,是松偶合的关系.3 抽象类能够定义方法的实现;   接口不能包含方法的实现。4 最大的区别是由抽象类可以派生出一些成员的实现,但接口却不包含任何成员的实现5 如果继承一个抽象类,当你类更新时,所有的子类都会跟着更新;而接口是一成不变的,一旦发布了一个接口,永远不要再更改它6 少量的的接口7 抽象类可以有实现的过程,而接口没有8 抽象类可以重载9 你只能继承一个抽象类,而接口被继承的同时还可以继承其它类和接口10 接口: 接口可以有静态成员、嵌套类型、抽象、虚拟成员、属性和事件。实现接口的任何类都必须提供

    接口中所声明的抽象成员的定义。接口可以要求任何实现类必须实现一个或多个其他接口。

    对接口有以下限制:

    接口可以用任何可访问性来声明,但接口成员必须全都具有公共可访问性。 不能向成员或接口自身附加安全性权限。 接口可以定义类构造函数,但不能定义实例构造函数。 每种语言都必须为需要成员的接口映射一个实现提供规则,因为不只一个接口可以用相同的签名声明成员,且这些成员可以有单独的实现

    抽象类:抽象类与接口紧密相关,它们不能示例化,并且常常部分实现或根本不实现。抽象类和接口之间的一个主要差别是:类可以实现无限个接口,但仅能从一个抽象(或任何其他类型)类继承。从抽象类派生的类仍可实现接口。可以在创建组件时使用抽象类,因为它们使您得以在某些方法中指定不变级功能,但直到需要该类的特定实现之后才实现其他方法。抽象类也制定版本,因为如果在派生类中需要附加功能,则可以将其添加到基类而不中断代码。

    11 接口是非常简单、原始的东西,例如没有设计传递性(IA应用IB,IC应用IA,但是IC并不具有IB接口,此时只能让IC额外应用IB接口),不能用来复用代码流程等。如果你的类继承了接口IA,那么当IA稍有修改的时候,所有应用了IA的代码都会垮掉,必须重新写。

    抽象类仅仅是因为有个别内容暂时决定不了,大部分内容还是在高层次就说清楚的用来继承的。如果你在高层次就全是虚拟的,那么这个类是完全空洞的,此时机非常像接口了(尽管仍然比接口方便一些,例如具有设计传递性)。但是.net、java等不支持多重继承,相比c++的能力要差很远。

    功能强大的、面向逻辑、面向对象、具有现成的自动化控制逻辑的编程方式总是被只会琐碎、顺序地编程的人妖魔化。只会c的人妖魔化c++,只会接口的人妖魔化继承,等等。其实任何东西都不是不必要的,你看java的各种系统、.net的类库,简单看一下源代码到底哪些东西在对系统结构的实用性起关键作用,难道它们用接口来替代了继承了吗?

    空洞的类没有什么价值,尽量设计有实质内容的类。这就在实用性、内容上与接口清楚地分开了。

    但是很遗憾.net、java不支持多重继承,不得不用接口来勉强模拟。

    传统的COM等标准也不支持多重继承。被逼无奈,那些开发世界上最实用、最赚钱的个人系统的应用大师(而不是那些书写各种规范的大学教授们)大量使用object类型,以便使用后期绑定的各种技巧来模拟只有多重继承才具有的功能。范型有点缓解这些object造成的问题。

     

    =========================================================================抽象方法是必须实现的方法。就象动物都要呼吸。但是鱼用鳃呼吸,猪用肺呼吸。 动物类要有呼吸方法。怎么呼吸就是子类的事了。 现在有很多讨论和建议提倡用interface代替abstract类,两者从理论上可以做一般性的混用,但是在实际应用中,他们还是有一定区别的。抽象类一般作为公共的父类为子类的扩展提供基础,这里的扩展包括了属性上和行为上的。而接口一般来说不考虑属性,只考虑方法,使得子类可以自由的填补或者扩展接口所定义的方法,就像JAVA王子所说的事件中的适配器就是一个很好的应用。 用一个简单的例子,比如说一个教师,我们把它作为一个抽象类,有自己的属性,比如说年龄,教育程度,教师编号等等,而教师也是分很多种类的,我们就可以继承教师类而扩展特有的种类属性,而普遍属性已经直接继承了下来。 而接口呢~还是拿教师做例子,教师的行为很多,除了和普通人相同的以外,还有职业相关的行为,比如改考卷,讲课等等,我们把这些行为定义成无body的方法,作为一个集合,它是一个interface。而教师张三李四的各自行为特点又有不同,那么他们就可以扩展自己的行为body。从这点意义上来说,interface偏重于行为。 总之,在许多情况下,接口确实可以代替抽象类,如果你不需要刻意表达属性上的继承的话。

     


    最新回复(0)