Dart中强制向下转型时,能否让对象丢失子类构造的额外成员?
在Dart中无法通过类型转换让对象“丢失”子类成员
首先直接给出结论:不行,你没办法仅通过类型转换就让一个子类实例“丢失”它的额外成员。
你的示例代码里,_foo虽然被声明为Foo类型,但它在运行时本质上还是一个Bar实例——类型转换(不管向上还是向下)只是改变了代码里的静态类型标注,完全不会修改对象本身的结构和数据。所以当你把_foo转回Bar类型时,它依然保留着another属性的值,输出world是完全符合预期的。
在Dart的面向对象模型里,对象的运行时类型是它被创建时就确定的,一旦你用Bar的构造函数创建了实例,它就永远是Bar类型,不会因为被赋值给父类类型的变量就变成纯粹的Foo。
如果你的需求是得到一个真正的Foo实例(不带Bar的额外成员),唯一的办法就是重新构造一个新的Foo对象,利用现有实例的父类属性来初始化:
void main() { const Foo _foo = Bar('hello','world'); // 创建真正的Foo实例,剥离Bar的额外成员 const Foo realFoo = Foo(_foo.message); // 这里如果尝试转成Bar会报错,因为realFoo是真正的Foo实例 // const Bar _bar = realFoo; // 编译错误 }
简单来说,类型转换只是“视角”的变化,不是对象本身的变化——你不能通过换个视角看对象,就让它的一部分消失。
内容的提问来源于stack exchange,提问作者user9836706
相关产品推荐
相关产品推荐

