java,从父类(super class)初始化子类

标签 java initialization subclass superclass extends

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到子类

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

为什么不能将 BaseClass 转换为 SubClass(来自 Subclass extends BaseClass)?为什么 Java 不允许我执行以下操作:

例子:

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

然后

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

之后对象 sub应具有来自对象的属性名称 btitle属性为空

为什么在 java 中不是这样?

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

最佳答案

如果你有一个 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 instead .

编辑 根据您的评论,听起来您想构建一个 SubClass 的列表使用 Base 列表的实例实例作为开始。一种方法是为 SubClass 定义构造函数这需要 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);
}

关于java,从父类(super class)初始化子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15802290/

相关文章:

java - 使用 Xuggler 使用 Java 编写 RTP 服务器

java - 单选按钮无法正常工作

java - tomcat 不可访问/管理器可访问

swift - 使用 RxSwift 自定义 UIControl 子类

java - 创建新的子类实例

java - 比较 2 128 以下的整数

iphone - NSObject 默认构造函数

c++ - Boost message_queue : just the constructor lets me configure it, 无其他成员函数可用

Ruby - 使用错误数量的参数初始化对象

ios - UIButton 子类标题更改