假设我有这些课程:
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 ();
以上所有显然都被打破了,实现这一目标的正确方法是什么?
假设我有这些课程:
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;
....
}