您可能想要检查组合而不是继承
有利于组合而不是继承是一种设计原则,它赋予设计更高的灵活性,从长远来看,赋予业务领域类和更稳定的业务领域。换句话说,HAS-A 可以比 IS-A 关系更好
在相关帖子中查看aleemb的答案,他在其中解释了与代码示例的区别
这是一个有用的链接,它解释了为什么更喜欢组合而不是继承
尽管组合和继承都允许您重用代码,但继承的缺点之一是它破坏了封装。如果子类的操作依赖于超类的行为,它会突然变得脆弱。当超类的行为发生变化时,子类中的功能可能会被破坏,而不会对其进行任何更改。继承使代码变得脆弱的一个例子是来自 HashSet 的方法 add() 和 addAll()。假设,如果HashSet的addAll()是通过调用add()方法实现的,你写了一个HashSet的子类,在插入HashSet之前对内容进行加密。由于只有一种方法 add(),它可以将对象插入 HashSet,因此您覆盖这些方法并通过覆盖 add() 调用您的 encrypt() 方法。这也会自动覆盖 addAll(),因为 addAll() 是使用 add() 实现的,它看起来很诱人。如果你仔细观察,你会发现这个实现很脆弱,因为它依赖于超类的行为。如果基类想要提高性能并在不调用 add() 方法的情况下实现 addAll(),则下面的示例将中断。
public class EncryptedHashSet extends HashSet{
.....
public boolean add(Object o) {
return super.add(encrypt(o));
}
}
如果您使用组合来支持继承,您将不会遇到这个问题,并且您的类会更加健壮,因为您不再依赖超类行为。相反,您使用超类方法添加部分,您将受益于 addAll() 的任何改进,如下例所示:
public class EncryptedHashSet implements Set{
private HashSet container;
public boolean add(Object o) {
return container.add(encrypt(o));
}
public boolean addAll(Collection c) {
return conatainer.add(encrypt(c));
}
.......
}