在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
extendsParentClass
。假设ChildVariable
扩展ParentVariable
然后可以将ParentClass
参数化为class ParentClass
将变量定义为T variable
。然后做类ChildClass扩展ParentClass
谢谢你的回答,这是一个非常有趣的解决方案,但不幸的是我不能使我的父类抽象。谢谢你的回答,这是一个非常有趣的解决方案,但不幸的是我不能使我的父类抽象。