C# 如何从其基类的实例创建新对象?
我有一个基类a,它有一个返回自身实例的方法:C# 如何从其基类的实例创建新对象?,c#,oop,C#,Oop,我有一个基类a,它有一个返回自身实例的方法: class A { protected DateTime P { get; private set; } protected A() { P = DateTime.Now; } protected A GetOneA() { return new A(); } } 我需要基于对象创建子类B的实例 class B : A { private B(A a
class A
{
protected DateTime P { get; private set; }
protected A()
{
P = DateTime.Now;
}
protected A GetOneA()
{
return new A();
}
}
我需要基于对象创建子类B的实例
class B : A
{
private B(A a)
{
//help
}
public B GetOneB()
{
A a = A.GetOneA();
return new B(a);
}
}
可能吗?是的,可能。首先创建一个“复制”构造函数并传递一个类实例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);
}
}
如果这不是你要找的,请告诉我
进一步阅读复制构造函数:这在技术上是不可能的。也就是说,如果我理解您的目标是将某个类的实例设置为具有独立的“父”实例。我想这在逻辑上是错误的
你最好解释一下你想做什么。也许你只是想把对象的属性复制到你自己的属性中;在这种情况下,它非常直接向前…您为受保护的对象创建了构造函数。B已经包含A,因为它
是A。当调用B的构造函数时,它将隐式调用A的默认构造函数。您的GetOneB
方法所做的是调用GetOneA,它分配A
,然后分配一个B
,该复制是以a
作为参数构建的
有一个关注点分离的问题。有初始化,也有分配。如果B
是a
,并且a
s只能以某种方式分配,那么B
不能仅以某种方式分配其a
部分,而以另一种方式分配其B
部分。整个B
必须以一种方式分配,但可以以其他方式进行初始化
如果必须以不同于B
其余部分的方式分配A
,则必须使用包含并创建has-A
关系
编辑:我们说的是C#,所以大部分都是无关的,因为如果你在C#中工作,你可能没有手动管理内存分配。在任何情况下,您都不需要调用GetOneA
,因为B
是一个A
,而A
的构造函数在构建B
时被调用。超级“?这是一个C#question=D,不是吗:private B(a):base(a)
?修复了你的语法-你不能从代码中调用base
构造函数,只能使用构造函数链接。@Feramef是的,像这样,但没有分号;-)是的,复制粘贴了所有的东西。你能再解释一下你为什么要这么做吗?这似乎有点奇怪。