Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中的子类中使用父变量的扩展版本_Java_Inheritance_Parent Child_Extends - Fatal编程技术网

在Java中的子类中使用父变量的扩展版本

在Java中的子类中使用父变量的扩展版本,java,inheritance,parent-child,extends,Java,Inheritance,Parent Child,Extends,我有一个扩展类,它需要使用父类中变量的扩展版本。到目前为止,我一直在这样使用它: public class ParentClass { protected ParentVariable variable; public ParentClass(){ this.variable = new ParentVariable(); } .... } public class ChildClass extends ParentClass { pu

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

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

只要我每次使用variable时都将其转换为childvariable,这或多或少是有效的,但这很难看,并且会引发一些问题。有没有更好的方法来执行此操作?谢谢。

如果可以将超类抽象化,您可以使用泛型解决此问题:

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
    }
}
公共抽象类父类
{
私有T变量;
受保护的getVariable(){
返回变量
}
受保护的无效设置变量(T变量){
this.variable=变量;
}
....
}
公共类ChildClass扩展了ParentClass
{
公共儿童班(){
setVariable(新的ChildVariable());
//其中ChildVariable扩展了ParentVariable
ChildVariable foo=getVariable()//无强制转换
}
}
请注意,我将您的字段设置为私有。您应该始终通过getter和setter方法访问字段,即使在子类中也是如此


如果这是不可能的(也许即使它是),这是一个指标,你的设计是有缺陷的。可能需要重构所有for类来实现干净的体系结构。不幸的是,这取决于所有四个类的整个实现,也可能取决于这些类所使用的整个上下文。这个问题的答案对于stackexchange来说太宽泛了。

如果可以将超类抽象化,您可以使用泛型来解决这个问题:

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
    }
}
公共抽象类父类
{
私有T变量;
受保护的getVariable(){
返回变量
}
受保护的无效设置变量(T变量){
this.variable=变量;
}
....
}
公共类ChildClass扩展了ParentClass
{
公共儿童班(){
setVariable(新的ChildVariable());
//其中ChildVariable扩展了ParentVariable
ChildVariable foo=getVariable()//无强制转换
}
}
请注意,我将您的字段设置为私有。您应该始终通过getter和setter方法访问字段,即使在子类中也是如此


如果这是不可能的(也许即使它是),这是一个指标,你的设计是有缺陷的。可能需要重构所有for类来实现干净的体系结构。不幸的是,这取决于所有四个类的整个实现,也可能取决于这些类所使用的整个上下文。这个问题的答案对于stackexchange来说太宽泛了。

不清楚:如果超类中的所有方法在子类中也可见,为什么您需要始终强制转换它。ChildClass中定义的变量在哪里?@EugeneS我想OP在他的代码中忘了提到
ChildClass
扩展
ParentClass
。假设
ChildVariable
扩展
ParentVariable
然后可以将
ParentClass
参数化为
class ParentClass
将变量定义为
T variable
。然后做
class ChildClass extends ParentClass
不清楚:如果超类中的所有方法在子类中也可见,为什么您需要始终强制转换它。ChildClass中定义的变量在哪里?@EugeneS我想OP忘了在他的代码中提到
ChildClass
extends
ParentClass
。假设
ChildVariable
扩展
ParentVariable
然后可以将
ParentClass
参数化为
class ParentClass
将变量定义为
T variable
。然后做
类ChildClass扩展ParentClass
谢谢你的回答,这是一个非常有趣的解决方案,但不幸的是我不能使我的父类抽象。谢谢你的回答,这是一个非常有趣的解决方案,但不幸的是我不能使我的父类抽象。