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