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

时间:2011-03-01 00:55:29

标签: c# oop

我有一个基类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);
    }
}

有可能吗?

3 个答案:

答案 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 aB并且A只能以某种方式分配,则A不能只分配其B部分方式和它的A部分另一种方式。整个B必须以一种方式分配,但是可以以其他方式完成初始化。

如果必须以不同于B的其他方式分配A,则必须使用包含并创建B关系。

编辑:我们正在谈论C#,所以大多数都是无关紧要的,因为如果你在C#工作,你可能不会手动管理内存分配。在任何情况下,您都不需要致电has-a,因为在GetOneA时会调用B is-an AA的构造函数是建造的。

答案 2 :(得分:0)

技术上不可能没有。也就是说,如果我理解您的目标是将某个类的实例设置为具有独立的“父”实例。我认为这在逻辑上是错误的。

你会更好地解释你想做什么。也许您可能只想将对象的属性复制到您自己的属性中;在这种情况下,它是非常直接的... ...