我正在尝试创建一些简单的Swing
类,我偶然发现了一个关于如何最好地安排对实现抽象类的具体类中实现的方法的调用的问题。
目前,我拥有抽象类和抽象类的小层次结构的最顶级父级,并调用抽象(在最顶级和第二级级别)addComponents()
类的方法,这些类的方法是作为子级的这个等级。这提出了一个关于应该在何处定义和调用这种方法的查询,因为这样做的目的是将这种方法的定义放在扩展层次结构子级的类中。
层次结构如下:
public abstract class AbstractFieldPanel extends JPanel
public abstract class BorderedFieldPanel extends AbstractFieldPanel
public class ExampleDataPanel extends BorderedFieldPanel
public class FieldPanel extends AbstractFieldPanel
我想指定在先前BorderedFieldPanel
方法的实现中扩展AbstractFieldPanel
和abstract addComponents()
的类中要添加哪些组件的详细信息。
addComponents()
mehtod的调用因此abstract
在BorderedFieldPanel
和AbstractFieldPanel
中定义。
addComponents()
方法的具体实现位于ExampleDataPanel
和FieldPanel
,这些是其使用的预期实例。
我遇到的问题是,在多态性原因下我是否正确将调用抽象方法放在层次结构AbstractFieldPanel
中最高类的构造函数中,或者它是否应该从构造函数中调用层次结构中的最低级别?
我最初假设这是一个很好的 OO 设计,利用了继承和多态属性以及抽象类的委托。
但是,如果这是正确的,那么在考虑在扩展类的第一行显式或隐式调用super()
构造函数时,这必然会出现问题(在某些情况下)。因此,从设计的角度来看,某种程度上并不一定是正确的做法,我希望就如何最好地接近这一点寻求建议。
答案 0 :(得分:0)
如果要确保在创建对象时添加这些组件,则可以在AbstractFieldPanel
的构造函数中将它们作为参数(而不是no-args构造函数)。这意味着子类构造函数必须调用super(components)
将组件对象的集合传递给超类构造函数。然后AbstractFieldPanel
实际上会添加它给出的组件。
答案 1 :(得分:0)
由于我更喜欢使用合成而不是继承,为什么不使用包含addComponents()
的接口并让您的具体类实现该接口?
警告,个人意见
抽象类(对我来说)代码气味,因为它主要用于将代码DRY保存在子类中,创建人工的,非功能的类('这个类的目的是什么,它做什么?抽象类什么都不做,什么也做不了,因为它不完整。')。更难测试,导致重复测试(方法是从所有子类测试,而不是只测试一次)。当然,有些情况下它实际上很有用,但我更喜欢松散耦合的代码,因此它更容易测试。