如何正确扩展类

时间:2016-06-02 15:53:09

标签: java class oop inheritance

如果我正在扩展一个具有自己的受保护成员变量和方法的类,那么在子类(或进行扩展的类,无论哪个是正确的)中,如何正确引用这些内容?

例如,如果我在扩展类中有protected int mInt,我是否在子类中创建另一个int mInt并初始化它?或者我是否总是直接引用父类的字段和方法?

我问,因为我需要确保某些对象具有某些字段,所以我需要它们来扩展相同的父类,但我不知道这对于如何构造子类中的方法意味着什么。我是一直只使用super还是制作所有父内容的“本地”副本是个好主意?

2 个答案:

答案 0 :(得分:1)

受保护的方法是类的API的一部分,它们的用法类似于公共方法,但它们的可见性仅限于子类,这有时很有用。

另一方面,

受保护的字段几乎不是一个好主意,因为它们使类无法维护其不变量。举个例子:

class Divider {
   protected int divisor;

   public void setDivisor(int divisor) {
       //we need to check the input to make sure our Divider works correctly 
       if (divisor == 0)
           throw new IllegalArgumentException("divisor can't be zero");
       this.divisor = divisor;
   }

   public int divide(int number) {
       return number/divisor;
   }
}

到目前为止,非常好,但另外一个类是:

class BadDivider extends Divider {
    public void doABadThing() {
        this.divisor = 0;
    }
}

现在我们情况很糟糕:维持班级不变量(即divisor != 0)的所有努力都被BadDivider破坏了。由于任何人都可以延长Divider,因此无法阻止这种情况发生。这也告诉我们何时可以使用受保护的字段:当您可以保证控制所有可以继承它们的类时。这很少发生。

所以解决方案是保持每个字段都是私有的,并确保检查方法(和构造函数)的输入。这允许您推断对象的内部状态,并保证它们始终处于有效状态。

答案 1 :(得分:0)

我总是使用私有属性;除非真的需要,否则没有二传手;如果需要公开类成员,请使用接口。 话虽这么说,你会继承班级成员。如果不能从子进程访问,你可以引用super,你不需要在子类中创建另一个mInt int;如果需要在子类中设置值,则在父级中有一个受保护的setter,并在子类/类中使用。我建议阅读设计模式和4个核心OO原则。希望有所帮助。