java,从超类初始化子类

Rami.Q:
public class Base {
  //long list of attributes
  // no Constructor using fields
  // no init methode 
  // i cannot change this class
}

现在,我将基类扩展为:

public class subClass extends Base{
   private boolean selected;

   ...
   getter und setter
   ...
}

我成为基础对象列表 List<Base>

但是我需要相同的列表,但是List<SubClass>有没有办法从基类初始化子类?

例:

for(Base b: list){
   SubClass sub = (SubClass)b; // Thats wrong i know
   if(...){
       sub.setSelected(true);
   }
   newList.add(sub);
}

我试图避免手动将基Class的每个属性初始化为子类

我按照评论中的要求更新了我的问题:上面的设计只是一个示例。我的QUESTIN完全是:

为什么Subclass extends BaseClass无法将BaseClass转换为SubClass(s​​ence )?为什么Java不允许我执行以下操作:

例:

Class Base{
   private String name;
.....
}
Class SubClass extends Base{
   private String title;
}

然后

Base b = DBController.getById(...);
SubClass sub = (SubClass)b; 

之后,该对象sub应具有该对象的属性名称,b并且该title属性为null

为什么在Java中不是这种情况?

对不起,我的英语不好,谢谢

泰德·霍普(Ted Hopp):

如果您有个List<Base>,则无法将其转换为List<SubClass>这主要是因为列表可能不包含的实例SubClass您能做的最好的事情是:

List<SubClass> newList = new List<SubClass>();
for(Base b: list){
    if (b instanceof SubClass) {
        SubClass sub = (SubClass)b;
        . . .
        newList.add(sub);
    }
}

但是,通常,当您发现自己正在做这种事情时,您的设计就有问题了。您可能要避免子类化Base而改为使用composition

编辑根据您的评论,听起来您想SubClass使用Base实例列表作为开始来构造实例列表一种方法是定义一个SubClass以a Base作为参数的构造函数。

public class SubClass extends Base{
    private boolean selected;

    public SubClass() {
        // default constructor
    }

    public SubClass(Base original) {
        // copy constructor -- initialize some fields from
        // values in original, others with default values
    }
    ...
    getter und setter
    ...
}

然后,您可以使用以下方法构建新列表:

List<SubClass> newList = new List<SubClass>();
for(Base b: list){
    SubClass sub = new SubClass(b);
    . . .
    newList.add(sub);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么在Java中将超类初始化为子类?

为什么要在类的构造函数中初始化子类,类的子类类必须是静态的?

使用超类初始化子类对象Java

在调用超类的构造函数之前,有什么方法可以在Java中初始化子类的成员变量?

Java-在子类中初始化超类变量吗?

从现有超类实例化子类

用基类对象C ++初始化子类?

用父类初始化子类

使超类的初始化程序返回特定的子类?

如何最好地使用父类中的对象初始化子类的对象?

根据父类初始化的条件初始化子类

如果我使用超类来初始化子类对象,为什么该对象具有子类的属性,但是具有超类的方法呢?

使用基类构造函数初始化子类

Ruby-在不继承值的情况下自动初始化子类的类实例变量

使用python3中的现有超类实例初始化子类

初始化子类时可访问超类的变量

在子类中初始化超类对象

初始化子类时基类如何初始化

Python类继承:如何使用不在父类中的值初始化子类

从超类初始化子类的类实例变量

在@PostConstruct之后初始化子类

初始化子类不起作用

调用基类构造函数与初始化子类中的成员变量

在超类初始化之前,子类最终进行静态初始化?

初始化子类字段

使用python中父类的魔术方法__init__初始化子类

如何从抽象母类上的指针初始化子类?

当没有超类init适合时如何初始化子类

数据不是来自超类的子类初始化问题