Java继承将公共getter移动到父级

Java继承将公共getter移动到父级,java,inheritance,composition,Java,Inheritance,Composition,我有使用作文的儿童班,也有儿童班。如何将composition类的getter移到父类,而不是在每个子类中都有一个类似的getter public class child1 extends Parent { private CoolObjectTypeAAA coolObject; //coolObject getter } public class child2 extends Parent { private CoolObjectTypeBBB coolObject;

我有使用作文的儿童班,也有儿童班。如何将composition类的getter移到父类,而不是在每个子类中都有一个类似的getter

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.
}

这是可能的,还是我需要在每个孩子的课堂上都有类似的getter呢?

我建议你看看,因为这似乎就是你想要实现的目标。正确实现它涉及多个抽象类和许多子类,但它并不像看上去那么令人畏惧

您试图做的基本上看起来像是一个紧凑的版本,但它通常不是一个很好的方法,因为它会导致难以遵循在父类和子类之间来回跳跃的OO意大利面代码

记住,您已经将父对象定义为抽象对象是有原因的

我怀疑您的目标是最大限度地实现代码重用,通常当我看到这种代码时,这是因为有一些常见的“CoolObject”初始化代码,您不希望在子类中重复这些代码

在这种情况下,通常最好在父类中编写通用的“CoolObject”私有或受保护的初始值设定项,但仍在子类中构造特定类型的CoolObject,然后在从子类返回之前通过父类方法初始化它

在本例中,因为它是一个getter,所以除了返回私有对象之外,可能没有其他任何东西。如果是这种情况,那么最好是在父级中将泛型getter定义为抽象,然后在每个子级中重新定义。这样做的主要问题是,无论您在何处使用此代码,都需要不断地将类型转换为您期望的特定类型的CoolObject

因此,即使您在父对象中提供了抽象的CoolObject getter或具体的CoolObject getter,您最终还是希望为特定的CoolObject类型提供具体的getter实现

在设计这样的东西时要记住的一点是如何使用它

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


然而,有两个特定的父类子类,感觉这不是你想要的。我再次建议您看看,因为这似乎更像您正在尝试做的事情。

我建议您看看,因为这似乎是您正在尝试完成的事情。正确实现它涉及多个抽象类和许多子类,但它并不像看上去那么令人畏惧

您试图做的基本上看起来像是一个紧凑的版本,但它通常不是一个很好的方法,因为它会导致难以遵循在父类和子类之间来回跳跃的OO意大利面代码

记住,您已经将父对象定义为抽象对象是有原因的

我怀疑您的目标是最大限度地实现代码重用,通常当我看到这种代码时,这是因为有一些常见的“CoolObject”初始化代码,您不希望在子类中重复这些代码

在这种情况下,通常最好在父类中编写通用的“CoolObject”私有或受保护的初始值设定项,但仍在子类中构造特定类型的CoolObject,然后在从子类返回之前通过父类方法初始化它

在本例中,因为它是一个getter,所以除了返回私有对象之外,可能没有其他任何东西。如果是这种情况,那么最好是在父级中将泛型getter定义为抽象,然后在每个子级中重新定义。这样做的主要问题是,无论您在何处使用此代码,都需要不断地将类型转换为您期望的特定类型的CoolObject

因此,即使您在父对象中提供了抽象的CoolObject getter或具体的CoolObject getter,您最终还是希望为特定的CoolObject类型提供具体的getter实现

在设计这样的东西时要记住的一点是如何使用它

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

然而,有两个特定的父类子类,感觉这不是你想要的。我再次建议您看看,因为这看起来更像您要做的事情。

这个怎么样:

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 { }
抽象类父类{
受保护的对象;
公共父对象(T对象){
mcooloobject=coolObject;
}
公共T getCoolObject(){
返回mCoolObject;
}
}
类Child1扩展了父类{
公共子对象1(CoolObjectTypeAAA coolObject){
超级(coolObject);
}
public void demoType(){
//此类型检查为getCoolObject()的返回类型已细化为CoolObjectTypeAAA
CoolObjectTypeAAA co=this.getCoolObject();
}
}
类Child2扩展了父类{
公共子对象2(CoolObjectTypeBBB coolObject){
超级(coolObject);
}
public void demoType(){
//此类型检查为getCoolObject()的返回类型已细化为CoolObjectTypeBBB
CoolObjectTypeBBB co=this.getCoolObject();
}
}
抽象类CoolObject{}
类CoolObjectTypeAAA扩展了CoolObject{}
类CoolObjectTypeBBB扩展了CoolObject{}
本质上,您可以让子类指定它使用的
CoolObject
的任何特定子类型,以便