【问题标题】:Using an extended version of a parent variable in a child class in Java在 Java 的子类中使用父变量的扩展版本
【发布时间】:2017-07-11 08:20:26
【问题描述】:

我有一个扩展类,它需要使用父类中变量的扩展版本。到目前为止,我一直在像这样使用它:

public class ParentClass
{
    protected ParentVariable variable;

    public ParentClass(){
        this.variable = new ParentVariable();
    }
    ....
}

public class ChildClass extends ParentClass
{
    public ChildClass(){
        super();
        this.variable = new ChildVariable();
        //Where ChildVariable Extends ParentVariable
        ....
    }
}

只要每次我使用变量时我都会将其转换为 ChildVarible,这或多或少会起作用,但这很丑陋并且会引发一些问题。有没有更好的方法来执行此操作?谢谢。

【问题讨论】:

  • 不清楚:如果超类中的所有方法在子类中也是可见的,为什么还要一直转换它。
  • ChildClass中定义的变量在哪里?
  • @EugeneS 我认为 OP 在他的代码中忘记提及 ChildClass extends ParentClass
  • 假设 ChildVariable 扩展 ParentVariable 那么您可以将 ParentClass 参数化为 class ParentClass<T>,将变量定义为 T variable。然后做class ChildClass extends ParentClass<ChildVariable>

标签: java inheritance parent-child extends


【解决方案1】:

如果可以让你的超类抽象,你可以通过使用泛型来解决这个问题:

public abstract class ParentClass<T extends ParentVariable>
{
    private T variable;

    protected T getVariable(){
        return variable
    }

    protected void setVariable(T variable){
        this.variable = variable;
    }
    ....
}

public class ChildClass extends ParentClass<ChildVariable>
{
    public ChildClass() {
        setVariable(new ChildVariable());
        //Where ChildVariable Extends ParentVariable
        ChildVariable foo = getVariable() // no cast nessecary
    }
}

请注意,我已将您的字段设为私有。您应该始终通过 getter 和 setter 方法访问字段,即使在子类中也是如此。

如果这是不可能的(即使是这样),这表明您的设计存在缺陷。可能需要重构所有类以实现干净的架构。不幸的是,这取决于所有四个类的整个实现,以及可能使用这些类的整个上下文。对于 stackexchange 来说,答案过于宽泛。

【讨论】:

  • 感谢您的回答,这是一个非常有趣的解决方案,但不幸的是我无法使我的父类抽象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-15
  • 2020-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多