【问题标题】:How to correctly extend classes如何正确扩展类
【发布时间】:2016-06-02 15:53:09
【问题描述】:

如果我正在扩展一个拥有自己受保护的成员变量和方法的类,那么在子类中(或进行扩展的类,以正确者为准),我该如何正确引用这些东西?

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

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

【问题讨论】:

  • 当你扩展一个类时,你会得到一个受保护成员的“副本”。你不必做任何额外的事情。试试看,你会看到的。
  • 如果你真的想“正确”,你也想尽可能避免受保护的字段。它们使推理您的代码变得非常困难。
  • 您只需创建一个声明getName()getSourceData() 的接口,您的函数就可以接受任何实现该接口的对象。一个对象有哪些领域是它自己的私事。
  • @ArukaJ doesn't this mean it'll accept any-old-thing as long as the data types are correct 是的,确实如此。对此有两个答案:首先,接收方法的工作是检查其输入。其次,您还可以创建自己的NameSourceData 类,它们的构造函数将确保它们的构造正确。现在您的界面将显示:public Name getName(),您可以确定无论Name 来自何处,它都是格式良好的。仔细想想,这是一件非常强大的事情。
  • @ArukaJ 受保护的方法很好,它们就像可见性略有限制的公共方法。另一方面,受保护的字段几乎没有任何用处,我只能想到非常人为的情况,它们的使用是合理的。

标签: java class oop inheritance


【解决方案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,因此无法阻止这种情况的发生。这也告诉我们什么时候可以使用受保护的字段:什么时候可以保证控制所有可以继承它们的类。这种情况很少发生。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多