2011-03-01 96 views
2

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

这可能吗?

+0

你为什么要这样做? – 2011-03-01 00:59:22

+0

您能否提供更多关于您为什么需要这样做的背景?这看起来有点奇怪。 – Justin 2011-03-01 01:00:07

回答

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

“超级”?这是一个C#的问题= D – 2011-03-01 00:59:42

+0

抱歉,脑屁...概念仍然有效。 – Nix 2011-03-01 01:02:36

+0

是的,我只是在拖钓。 – 2011-03-01 01:04:34

0

它在技术上并不possile没有。也就是说,如果我理解你的目标是设置某个类的实例来拥有一个独立的“父”实例。我认为这在逻辑上是错误的。

你会做的更好地名释义你想要做什么。也许你可能只是想将对象的属性复制到你自己的属性中;在这种情况下,这是相当直盼着......

2

您为保护所作的构造。乙已经包含了A,因为它is-an A.当B中的构造函数被调用,它隐含的调用为A.你的GetOneB方法做的是调用GetOneA默认的构造函数,它分配一个A,其次是分配B是复制 - A a作为参数。

存在问题分离的问题。有初始化和分配。如果B是-和A s只能按特定方式分配,则B不能以某种方式分配其零部件A,而其他B部分则不能以另一种方式分配。整个B必须以一种方式分配,但其初始化可以以其他方式完成。

如果A必须以与B的其余部分不同的方式分配,那么您必须使用遏制并创建一个has-a关系。

编辑:我们正在谈论C#,所以大多认为是无关紧要的,因为如果你工作在C#你可能不手动管理内存分配。在任何情况下,您都不需要拨打GetOneA,因为Bis-anAA的构造函数在构造B时被调用。

相关问题