我有一个基类A,它有一个返回自身实例的方法:
class A
{
protected DateTime P { get; private set; }
protected A()
{
P = DateTime.Now;
}
protected A GetOneA()
{
return new A();
}
}
我需要根据A对象创建子类B的实例。
class B : A
{
private B(A a)
{
//help
}
public B GetOneB()
{
A a = A.GetOneA();
return new B(a);
}
}
有可能吗?
答案 0 :(得分:3)
是的,这是可能的。首先创建一个“复制”构造函数并传递A的类实例。在此构造函数中,您需要复制所有必需的属性。
class A
{
protected DateTime P { get; private set; }
protected A(A copy){
//copy all properties
this.P = A.P;
}
protected A()
{
P = DateTime.Now;
}
protected A GetOneA()
{
return new A();
}
}
然后只需调用超类复制构造函数。
class B : A
{
//help
private B(A a) : base(a)
{
}
public B GetOneB()
{
A a = A.GetOneA();
return new B(a);
}
}
如果这不是你想要的,请告诉我。
进一步阅读复制构造函数:http://msdn.microsoft.com/en-us/library/ms173116.aspx
答案 1 :(得分:2)
您为A保护了构造函数。 B已经包含A,因为它is-an
A.当调用B的构造函数时,它将隐式调用A的默认构造函数。你的GetOneB
方法正在做的是调用GetOneA,它分配一个{ {1}},然后分配A
复制构造B
作为参数。
存在分离问题的问题。有初始化和分配。如果A a
是B
并且A
只能以某种方式分配,则A
不能只分配其B
部分方式和它的A
部分另一种方式。整个B
必须以一种方式分配,但是可以以其他方式完成初始化。
如果必须以不同于B
的其他方式分配A
,则必须使用包含并创建B
关系。
has-a
,因为在GetOneA
时会调用B
is-an
A
和A
的构造函数是建造的。
答案 2 :(得分:0)
技术上不可能没有。也就是说,如果我理解您的目标是将某个类的实例设置为具有独立的“父”实例。我认为这在逻辑上是错误的。
你会更好地解释你想做什么。也许您可能只想将对象的属性复制到您自己的属性中;在这种情况下,它是非常直接的... ...