Agr*_*ag9 37 oop inheritance interface superclass
我已经阅读了很多关于Java中的接口和类继承的内容,我知道如何做到这两点,我觉得我对两者都有很好的感觉.但似乎没有人真正将两者并排比较,并解释了何时以及为什么要使用其中一种.我没有发现很多次实现接口比扩展超类更好的系统.
那么什么时候实现一个接口,什么时候扩展超类呢?
Bal*_*usC 42
如果要定义合同,请使用接口.即X必须取Y并返回Z.它不关心代码是如何做的.一个类可以实现多个接口.
如果要在非抽象方法中定义默认行为,请使用抽象类,以便最终用户可以重复使用它,而无需一次又一次地重写它.类可以从延伸仅一个其它类.只有抽象方法的抽象类可以像界面一样好.没有任何抽象方法的抽象类可以识别为模板方法模式(参见本答案的一些真实世界的例子).
反过来,只要您希望在定义默认行为时为最终用户提供自由,就可以完美地实现接口.
sam*_*aur 12
如果你想要的只是定义一个契约,即你希望继承类实现的方法签名,你应该选择一个接口.接口根本没有实现.继承类可以自由选择自己的实现.
有时您希望在基类型中定义部分实现,并希望将其余部分留给继承类.如果是这种情况,请选择一个抽象类.抽象类可以定义方法实现和变量,同时将一些方法保留为抽象.扩展类可以选择如何实现抽象方法,同时它们也具有超类提供的部分实现.
抽象类的一个极端是纯抽象类 - 一个只有抽象方法而没有其他方法的类.如果涉及纯抽象类与接口,请使用界面.Java只允许单个实现继承,而它允许多个接口继承,这意味着一个类可以实现多个接口,但只能扩展一个类.因此,在接口上选择纯抽象类意味着在实现抽象方法时不允许子类扩展任何其他类.
使用接口来定义行为.用户(抽象)类(和子类)提供实现.它们不是相互排斥的; 他们都可以一起工作.
例如,假设您正在定义数据访问对象.您希望DAO能够加载数据.所以在接口上加载一个load方法.这意味着任何想要将自己称为DAO的东西都必须实现加载.现在假设您需要加载A和B.您可以创建一个参数化(泛型)的通用抽象类,以提供有关加载如何工作的大纲.然后,您将该抽象类子类化,以提供A和B的具体实现.
使用抽象类和接口的主要原因是不同的。
当您的类对许多方法具有相同的实现,但有一些方法有所不同时,应该使用抽象类。
这可能是一个不好的例子,但是 Java 框架中抽象类最明显的使用是在 java.io 类中。 OutputStream只是一个字节流。该流的去向完全取决于OutputStream您正在使用的子类... FileOutputStream,,从 a的方法PipedOutputStream创建的输出流...java.net.SocketgetOutputStream
注意:java.io 还使用装饰器模式将流包装在其他流/读取器/写入器中。
当您只想保证一个类实现一组方法但不关心如何实现时,应该使用接口。
接口最明显的用途是在集合框架内。
我不关心如何List添加/删除元素,只要我可以调用add(something)并get(0)放置和获取元素即可。它可以使用数组 ( ArrayList, CopyOnWriteArrayList)、链表 ( LinkedList) 等......
使用接口的另一个优点是一个类可以实现多个接口。 是和LinkedList的实现。List Deque
| 归档时间: |
|
| 查看次数: |
31268 次 |
| 最近记录: |