问题描述
我可以从一个类继承而来,知道它的某些字段将永远不会被使用吗?
public class Parent {
private String a;
private String b;
private String c;
...
}
public class Child extends Parent {
private String d;
...
}
我是否可以从类似的类继承?我知道在我的Child类中,我将仅使用字段“ a”,“ b”,“ d”和“ c”字段吗?
P.S。不问编译器是否会抱怨。要求更好的设计实践。如果这是不好的做法,那么如何解决呢?
解决方法
如果您的父类允许扩展,并且子类不需要其父提供的所有信息,那么您的父类可能做得太多,可以分为不同的类
进行此重构后,可以扩展更适合您想要的行为的类。
,这里是分隔Parent
类的示例。
class AB {
Object a;
Object b;
}
class ABC extends AB {
Object c;
}
class ABD extends AB {
Object d;
}
继承对于代码重用而言是一个糟糕的工具,因此,如果这些类没有共享行为,则可以考虑使用组合。
class AB {
Object a;
Object b;
}
class ABC {
AB ab;
Object c;
}
class ABD {
AB ab;
Object d;
}
,
您在问错问题。可能有也可能没有问题,但是专注于类中包含的数据是错误的。您必须关注他们的行为。
芭芭拉·丽斯科夫(Barbara Liskov)在主题演讲“ Data Abstraction and Hierarchy”中介绍了通常所说的Liskov Substitution Principle,在Liskov和Jeannette Wing的论文“ A Behavioral Notion of Subtyping”中进行了扩展。这个想法是,如果一个子类型可以在程序中的任何地方替换超类型而又不影响其正确性,则它是另一种的子类型。也就是说,不破坏它。
如果将程序中的所有Parent
实例替换为Child
实例,将会发生什么情况?孩子可以做父母做的一切吗?它支持相同的操作吗?会产生相同的结果吗?
如果答案是肯定的,则Child
是Parent
的子类型。如果答案为“否”,则答案为“否”,并且不应作为其子类。字段c
是否相关完全取决于其使用方式。