Java继承将通用获取器移至父级

时间:2018-09-11 16:25:47

标签: java inheritance composition

我有一些子类,这些子类也使用复合类。而不是在每个子类中都具有类似的吸气剂,我如何将组合类的吸气剂移至父代。

public class child1 extends Parent {
   private CoolObjectTypeAAA coolObject;
   //coolObject getter
}

public class child2 extends Parent {
   private CoolObjectTypeBBB coolObject;
   //coolObject getter
}

public class CoolObjectTypeAAA extends CoolObject {
}

public class CoolObjectTypeBBB extends CoolObject {
}

public abstract class Parent {
    //would like to have a single CoolObject getter here in parent that returns the appropriate cool object of each child.
}

这是可能的吗?还是每个孩子班级都需要类似的吸气剂?

2 个答案:

答案 0 :(得分:1)

我建议您看看abstract factory pattern,因为这似乎是您要完成的工作。正确实现后,它会涉及多个抽象类和许多子类,但看起来并不那么令人生畏。

您尝试执行的操作基本上看起来像是这种方法的紧凑版本,但通常并不是一个好方法,因为它会导致难以遵循在父级和子类之间来回跳转的OO意大利面代码。

请记住,由于某种原因,您已经将Parent定义为抽象。

我怀疑您的目标是最大程度地提高代码重用性,通常当我看到这类代码时,是因为您不想在子类中重复一些常见的“ CoolObject”初始化代码。

在那种情况下,通常最好在父级中编写一个通用的“ CoolObject”私有或受保护的初始化程序,但仍要在子级中构造特定类型的CoolObject,然后通过父级方法对其进行初始化,然后再从中返回这个孩子。

在这种情况下,由于它是一个吸气剂,因此除了返回私有对象外,别无其他。如果是这样,那么最好的办法是在Parent中将一个通用的getter定义为abstract,然后在每个child中重新定义。这样做的主要问题是,无论您在哪里使用此代码,都需要不断地将类型转换为所需的特定CoolObject类型。

因此,很可能即使您在Parent中提供了抽象CoolObject getter或具体CoolObject getter,您最终仍然希望针对特定CoolObject类型提供getter的具体实现。

设计类似的东西时要牢记的是如何使用它。

如果目标是提供各种CoolObject的抽象,那么您基本上是在使用策略模式。在这种情况下,不需要将变量强制转换为CoolObject的子类型。在那种情况下,非特定类型的吸气剂(抽象或具体)是可行的。

但是,具有Parent的两个特定的子类,这并不是您想要的。我再次建议您看一下abstract factory pattern,因为这似乎更像您要尝试的操作。

答案 1 :(得分:1)

如何?

abstract class Parent<T extends CoolObject> {
    protected T mCoolObject;
    public Parent(T coolObject) {
        mCoolObject = coolObject;
    }

    public T getCoolObject() {
        return mCoolObject;
    }
}

class Child1 extends Parent<CoolObjectTypeAAA> {
    public Child1(CoolObjectTypeAAA coolObject) {
        super(coolObject);
    }
    public void demoType() {
        // This type checks as the return type of getCoolObject() has been refined to CoolObjectTypeAAA
        CoolObjectTypeAAA co = this.getCoolObject();
    }
}

class Child2 extends Parent<CoolObjectTypeBBB> {
    public Child2(CoolObjectTypeBBB coolObject) {
        super(coolObject);
    }
    public void demoType() {
        // This type checks as the return type of getCoolObject() has been refined to CoolObjectTypeBBB
        CoolObjectTypeBBB co = this.getCoolObject();
    }
}

abstract class CoolObject { }

class CoolObjectTypeAAA extends CoolObject { }

class CoolObjectTypeBBB extends CoolObject { }

本质上,您可以使子类指定其使用的CoolObject的任何特定子类型,以便它可以优化getter的返回类型,但您仍可以在超类中实现getter。