2012-09-06 53 views
3

我有兩個班,一個繼承了其他的,例如: -從繼承的類的實例易於轉換

public class A 
{ 
    public string AA { get; set; } 
    public double AB { get; set; } 
} 

public class B : A 
{ 
    public double? BA { get; set; } 
} 

現在,我知道,如果我有一個實例對象B,我可以將它轉換爲類型A,但我有一個A的實例,我想實例化爲類型B對象。我知道我可以在B的類中放置一個構造函數來複制所有的屬性值,但是基類A有很多屬性,並且可能會添加更多的屬性,所以我擔心會丟失一個或忘記添加它當我將它添加到A中時,它是否是B的構造函數?有沒有簡單的方法可以做到這一點?

------- ------編輯

感謝鄉親們,不是我的用例不幸的是,這是一個伴侶的我開除的問題。據我所知,有問題,他不能改變基類。據我所知,基類是一個掛鉤到數據庫調用的基類,然後他想要獲取這些數據併爲管理員編輯屏幕添加一些額外的屬性,然後他的代碼將用它來更新基礎數據對象的屬性。我的第一反應是將基礎對象作爲對象的一個​​屬性,但是有一個原因讓他使用他正在使用的工具「扁平化」要容易得多。我沒有認爲有這樣做的方式,但我認爲我會檢查以防我失去了一些東西 - 我認爲只是詢問基本問題會更容易,而不是包括背景,可能只是提出更多的問題和渾水(AFAIK他患有「無法控制的情況」)。

+7

嗯,這不是你應該做的一切,往往擺在首位。這是大多數情況下潛在設計問題的一個標誌。你有可能會更好地使用組合而不是繼承。 B類應該有A類型的字段,而不是繼承它。 – Servy

+0

這是純粹的設計瘋狂。 – Arran

+0

這裏的實際用例是什麼?這通常表明您需要重新考慮設計。可能有更好的基本方法。 –

回答

2

我知道我可以把一個構造函數B的類,它會將所有屬性值結束了,但基類,A,有相當多的特性,很可能有更多的增加,所以我很擔心失蹤或者當我將它添加到A時,忘記將它添加到B的構造函數中。是否有一種簡單的方法可以做到這一點?

通常,這是設計缺陷的標誌。我會重新思考你的設計第一個,並確定這是否真的有必要,或者如果有另一種方法可以在這裏使用。這就是說...

有沒有簡單的方法來做到這一點。如果您需要從A實例創建B實例,那麼您確實需要將值複製到新實例。

然而,如果給定另一個A實例,一個更好的選擇可能會添加一個(可能protected)構造函數給A,它將設置所有這些屬性。 B然後可以使用它來創建它自己,它至少保留了匹配定義它們的類中所有屬性的要求。這應該會讓維護這個過程更容易。

0

c#中不支持反向多態。

0

正如裏德科普塞所說,這通常是設計缺陷的標誌。如果你需要這樣的工作,我會重新工作類圖。這聽起來像某種地方在繼承體系結構中犯了某種錯誤。

如果你所需要的只是爲了孩子和父母都實現常用的方法,以便當任何一個對象被傳遞給某個函數時,它可以對傳入對象上的一些常用方法進行操作,然後只需要兩個它們實現相同的接口(多態性),或者將函數參數作爲基類輸入,並確保這些方法存在於基類中。

1

我同意其他評論,你最好使用不同的設計,比如組合而不是繼承。

組成,如下圖所示,可以讓你修改的A類,而不需要對B類的任何變化

public class B 
    { 
     // Constructor 
     public B(A A) { this.A = A; } 

     // Class A as a read-only property 
     public A A { get; private set; } 

     // Other properties of class B 
     public double? BA { get; set; } 
    }