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

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

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

 abstract class A { abstract int getA(); } 

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

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

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

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

缺点 :当我们有多个字段(> 10)时,超级构造函数调用看起来有点难看和混乱。

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

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

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

如果您有太多字段,您可能希望重新组合POJO中的字段(如果新概念合适)。

我更喜欢第一个。 我不喜欢用fileds名称来组合课程,他们如何处理状态以及如何保存它。 第一个更接近开/关本金

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

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

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

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

1)你提到的那个 – 该字段不属于子类 – 它属于父类,这很重要,因为它是父母“需要”的,因为父母可以使用它

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

注意:如果你有一个有10个字段需要初始化的类,那么你的设计可能有问题。

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

2. 对于不断更改的Encapsulate Behaviors,它总是更好地进入Interface或Abstract类。

3. 对于不同类中相同行为需要不同实现的地方,您的第一个解决方法会很好。 然后在这个地方, 接口第一个解决方案将是一个不错的选择。

例如:

考虑使用paint()方法Painting为类。

现在

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

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

 public interface Paint{ paintDoIt(String style); } 

4.你的第二个解决方案将在一个地方很好, 你希望某些行为必须由子类实现。

例如:

汽车视为一个抽象类 ,现在to be car非常重要, 它必须有一个转向,四个轮子,引擎等。所以这些function必须实现

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