C# 使用父对象创建子对象
假设我有这些课程:C# 使用父对象创建子对象,c#,inheritance,C#,Inheritance,假设我有这些课程: Class A {}; Class B : A {} ; 以及一个返回a的函数: public A read_an_A(); 由于B是a的子代,我希望能够从以下意义上阅读它的a属性: B b = new B ( read_an_A() ); (假设使用默认的复制构造函数) 或者像这样: B b = (B) read_an_A (); 上述所有内容显然都被破坏了,实现这一点的正确方法是什么?一种方法是添加一个B的构造函数,该构造函数接受a,并从中获取相关部分: pub
Class A {};
Class B : A {} ;
以及一个返回a
的函数:
public A read_an_A();
由于B
是a
的子代,我希望能够从以下意义上阅读它的a
属性:
B b = new B ( read_an_A() );
(假设使用默认的复制构造函数)
或者像这样:
B b = (B) read_an_A ();
上述所有内容显然都被破坏了,实现这一点的正确方法是什么?一种方法是添加一个B的构造函数,该构造函数接受a,并从中获取相关部分:
public B(A a) {
this.x = a.x;
this.y = a.y;
}
你的B班最有可能知道该采取什么措施,因此这种方法也相当干净。它可以让你写作
B b = new B(read_an_A());
就像你在问题中建议的那样。当然,B也很可能需要其他构造函数。如果您不知道返回的A是否为B,则需要确保,否则会出现运行时异常
var a = read_an_A();
if (a is B)
{
var b = (B)a;
....
}
我不明白现在的情况,你确定返回的A是B吗?好的。所以我想我希望它能自动完成,谢谢。好吧,这从来都不是问题。事实上,现在它总是一个
A
。我只是在跳,有一种优雅的方式。就像一些默认的部分复制构造函数一样。所以这不是正确的方法,你继承不只是为了使用一些数据,继承是一种“是”关系,它意味着B是a的一种类型(狗是动物的一种,卡车是汽车的一种,等等),在你的情况下B使用a,B不是a