黑马程序员技术交流社区

标题: 有了抽象类为什么还要有接口 [打印本页]

作者: pozhenzi9010    时间: 2014-1-16 10:29
标题: 有了抽象类为什么还要有接口
本帖最后由 pozhenzi9010 于 2014-1-16 14:27 编辑

既然继承接口的类必须要实现接口中的方法,继承抽象类的类不也是必须实现抽象类中的抽象方法,为什么有了抽象类还要有接口,不都一个意思吗?
作者: 许庭洲    时间: 2014-1-16 10:42
1. 和非抽象类一样,抽象类也必须提供在基类列表中出现的所有接口成员实现;
2.  不同的是,抽象类允许将接口的方法映射到抽象的成员方法;
3.  例如下面的代码:
     interface IMethods
     {
          void F();
          void G();
     }
     abstract class C:IMethods
     {
          public abstract void F();
          public abstract void G();
      }
4. 上例子中,所有C的非抽象的派生类必须重载C中的抽象方法来提供对接口的实现。



作者: 浮出一个美    时间: 2014-1-16 11:02
因为接口比抽象类更懒,接口里面的所有成员都是public static final的,所有方法都是public abstract的,也就是说接口里没有任何实现,接口完全不用关心怎么实现自己定义的那些方法,方便设计。
作者: 放课后小朋友    时间: 2014-1-16 11:04
本帖最后由 放课后小朋友 于 2014-1-16 19:55 编辑

接口中无私有方法、变量。抽象可以有私有方法、变量。接口的实现是通过重写其中的所有方法,继承只需要重写用到的方法。java中只有单继承,但接口可以通过多个接口实现多继承(专业名词:多重继承)。
开始回答的过于简单,让版主取笑我了

作者: 幸福的彼岸    时间: 2014-1-16 11:18
1、抽象类是一个特殊的类,而接口只是一个行为的规范或规定;

2、抽象基类可以定义字段、属性、和方法实现。接口只能定义属性、索引器、事件和方法声明,不能包含字段;

3、抽象类更多的是定义在一系列紧密相关的类之间,而接口大多数是定义在关系疏松但都实现某一功能的类中;

4、接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法;5、抽象类不能被密封。

6、一个类一次可以实现若干个接口,但是只能扩展一个父类;7、接口可以用于支持回调,而继承并不具备这个特点;

8、抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法却默认为非虚的,当然您也可以声明为虚的;

9、接口与非抽象类类似,抽象类也必须为在该类的基类列表中列出的接口的所有成员提供它自己的实现。但是,允许抽象类将接口方法映射到抽象方法上。

10、如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法。
作者: 沈可    时间: 2014-1-16 16:53
抽象类(abstract class)和接口(interface)都可以通过继承实现其方法,但是还有许多区别: 1、接口支持多继承;抽象不能实现多继承
2、接口只能定义行为;抽象类既可以定义行为,还可提供实现
3、接口只包含方法、属性、索引器、事件的签名,不能定义字段和包含实现的方法;抽象类可以定义字段、属性、包含有实现的方法。
4、接口可以作用于值类型(Struct)和引用类型(class);抽象类只能作用于引用类型。


作者: 王忠杰    时间: 2014-1-18 13:38
1. 类是对对象的抽象,可以把抽象类理解为把类当作对象,抽象成的类叫做抽象类.而接口只是一个行为的规范或规定,微软的自定义接口总是后带able字段,证明其是表述一类类“我能做。。。”。抽象类更多的是定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类中;
      2. 接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法;
      3. 一个类一次可以实现若干个接口,但是只能扩展一个父类;
      4. 接口可以用于支持回调,而继承并不具备这个特点;
      5. 抽象类不能被密封;
      6. 抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法却默认为非虚的,当然您也可以声明为虚的;
      7.(接口)与非抽象类类似,抽象类也必须为在该类的基类列表中列出的接口的所有成员提供它自己的实现。但是,允许抽象类将接口方法映射到抽象方法上;
      8. 抽象类实现了oop中的一个原则,把可变的与不可变的分离。抽象类和接口就是定义为不可变的,而把可变的座位子类去实现;
      9. 好的接口定义应该是具有专一功能性的,而不是多功能的,否则造成接口污染。如果一个类只是实现了这个接口的中一个功能,而不得不去实现接口中的其他方法,就叫接口污染;
     10. 尽量避免使用继承来实现组建功能,而是使用黑箱复用,即对象组合。因为继承的层次增多,造成最直接的后果就是当你调用这个类群中某一类,就必须把他们全部加载到栈中!后果可想而知。(结合堆栈原理理解)。同时,有心的朋友可以留意到微软在构建一个类时,很多时候用到了对象组合的方法。比如 asp.net中,Page类,有Server Request等属性,但其实他们都是某个类的对象。使用Page类的这个对象来调用另外的类的方法和属性,这个是非常基本的一个设计原则;
     11.如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2