2011-03-01 147 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時被調用。

相關問題