如何解决Java中缺少抽象字段的问题?

时间:2012-07-21 13:36:01

标签: java abstract-class field

假设我们有一个抽象类A,我们想要强制所有子类都有一个特定的字段。这在Java中是不可能的,因为我们无法定义抽象字段。

解决方法1:强制子类实现提供所需值的方法。

abstract class A {
  abstract int getA();
}

缺点:每个子类都必须为我们想要的每个抽象字段实现一个方法。这可能导致许多方法实现。

Advantage :我们可以在抽象类中使用方法getA,并在A中使用它实现方法,而无需在每个子类中实现它们。但是方法背后的价值不能被抽象类覆盖。

解决方法2:通过强制子类为抽象类提供值来模拟抽象字段。

abstract class A {
  int a;

  public A(int a) {
    this.a = a;
  }
}

缺点:当我们有多个字段(> 10)时,超级构造函数调用看起来会有点丑陋和令人困惑。

Advantage :我们可以在抽象类中使用字段a,并在A中使用它实现方法,而无需在每个子类中实现它们。另外,值a可以被抽象类覆盖。

问题:哪种解决方法是实现目标的常用方法?也许有一个比上面的更好?

5 个答案:

答案 0 :(得分:2)

抽象方法可能是最面向对象的。

如果你有太多的字段,你可能想要重新组合POJO(如果一个新的概念是合适的)。

答案 1 :(得分:1)

我更喜欢第一个。我不喜欢在文件名中结合课程,他们如何处理状态以及如何保存它。第一个更接近open/close principal

我建议避免继承。继承非常琐碎,难以维护。记住有效的java建议 - 更喜欢组合其他继承

答案 2 :(得分:0)

我认为opt.1是目前为止的清洁工。一些吸气剂和制定者并不是什么大问题,我怀疑许多用例不仅仅是一些抽象的“领域”。

关于opt.2,您忘记了构造函数不是继承的,因此需要以考虑a的方式实现所有子类构造函数。

答案 3 :(得分:0)

解决方法2很常见,因为有两个优点:

1)你提到的那个 - 该字段不属于子类 - 它属于父类,这很重要,因为它是"要求"由父母和因为父母可以使用它

2)从父级子类进行子类化时,您非常了解此字段,因为在实现构造函数时,必须将其传递给它。如果我看到第一个解决方法,我就不知道从中理解什么,这样我就明白父类需要这个字段才能工作,所以它必须有一个有意义的值。

注意:如果你的某个类有10个需要初始化的字段,那么你的设计可能会出错。

答案 4 :(得分:0)

1。实际上它不是关于什么,而是关于的灵活性和能力        适应变化

2。 封装不断变化的行为,无论是接口还是抽象类,总是更好。

3。 第一个解决方法需要针对不同类别中的相同行为的不同实现的地方会很好。然后在这个地方,界面第一次解决方法将是一个不错的选择。

<强>例如

Painting视为具有paint()方法的类。

现在

paint()方法可以有Stroking,gliding,shading等样式。

然后最好将该方法封装到Abstract类或接口中。

public interface Paint{

paintDoIt(String style);

}

4。 第二个词汇在一个地方会很好,您希望某些行为必须由子类实现。 < / p>

例如:

汽车视为抽象类,现在to be car非常重要它必须具备    转向,4轮,发动机等。因此必须实施这些功能

其中音乐系统,LCD等其他功能是可选的,取决于车型。