子类继承的字段从不使用

Subclass inherited field is never used

我可以从一个 class 继承,知道它的某些字段永远不会被使用吗?

假设我有一个 Parent class 及其子class Child:

public class Parent {
    private String a;
    private String b;
    private String c;
...
}

public class Child extends Parent {
    private String d;
...
}

是否允许我从 class 继承,因为我知道在我的 Child class 中我将只使用字段“a”、“b”、“d”和永远不会使用字段“c”?

P.S。不问编译器是否会抱怨。要求更好的设计实践。如果这是不好的做法,那么如何解决?

如果您的 Parent class 允许扩展并且 Child class 不需要其 Parent 提供的所有信息,那么 很可能你的Parentclass做的太多了,可以分成不同的classes.

进行此重构后,您可以扩展 class 以更好地适应您想要的行为。

这里有一个分隔 Parent class.

的例子
class AB {
    Object a;
    Object b;
}
class ABC extends AB {
    Object c;
}
class ABD extends AB {
    Object d;
}

继承对于代码重用来说是一个糟糕的工具,因此如果这些 classes 没有共享行为,您可以考虑使用组合。

class AB {
    Object a;
    Object b;
}
class ABC {
    AB ab;
    Object c;
}
class ABD {
    AB ab;
    Object d;
}

你问错问题了。可能有问题也可能没有问题,但是关注类中包含的数据是错误的。你必须关注他们的行为。

在 Liskov 和 Jeannette Wing 的主旨演讲“Data Abstraction and Hierarchy" Barbara Liskov introduced what is commonly known as the Liskov Substitution Principle, expanded on in the paper "A Behavioral Notion of Subtyping”中。这个想法是,如果一种类型可以在程序中的任何地方替换超类型而不影响其正确性,则一种类型是另一种类型的子类型;也就是说,不破坏它。

如果将程序中的所有 Parent 个实例替换为 Child 个实例,会发生什么情况? child 可以做 parent 做的所有事情吗?它是否支持相同的操作?它会产生相同的结果吗?

如果答案是肯定的,那么 ChildParent 的子类型。如果答案是否定的,那么它就不是,也不应该是它的子类。字段 c 是否相关完全取决于它的使用方式。