C# 如何从其基类的实例创建新对象?

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

我有一个基类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是的,像这样,但没有分号;-)是的,复制粘贴了所有的东西。你能再解释一下你为什么要这么做吗?这似乎有点奇怪。