2011-03-08 72 views
0

如果我有一個父類:C#集繼承類等於基類

public class ParentClass 
{ 
    public string ParentStr = string.empty; 
} 

和子類:

public class ChildClass : ParentClass 
{ 
    public string ChildStr = string.empty; 
} 

說後來在我的代碼我有父類

的實例
ParentClass parentClass = New ParentClass() { ParentStr = "something" } 

是否可以從ParentClass創建一個ChildClass的實例?東西的效果:

ChildClass childClass = (ChildClass)parentClass 
+2

你有你「是一個」關係倒退 - 回OO基本面 – BrokenGlass

+0

@BrokenGlass,樂於助人。謝謝。 –

+0

不允許我再編輯:在你的情況下,childClass是一個'parentClass,這意味着你可以將childclass的實例分配給父類型的變量(而不是其他方式) – BrokenGlass

回答

0

號ChildClass是不同類型的,你不能投的父類的一個實際的運行實例的ChildClass。

2

我想你可以提供一個implicitexplicit運算符來做到這一點,儘管它看起來很奇怪。

子類化定義了一個is-a關係,但子類是 - 超類,而不是其他方式。在不知道你的課程是什麼的情況下,我想你的設計問題已經超出了這個範圍。

+0

對於「子類是 - 一個超類,而不是相反「。孩子是他們的父母;父母不是他們的孩子。 – KeithS

3

把它看成在英語方面:如果你的父類是Animal和子類是Dog,你可以說,毫無疑問,是一個AnimalDog

用另一個問題回答一個問題並不好,所以真正的答案是:不,你不能將一個基類的實例投射到一個子類中。

但是,如果您將子類的實例存儲在基類類型的變量中,則可以將其轉換回子類。以下是有效的:

ParentClass p = new ChildClass(); 
ChildClass c = (ChildClass)p; 
0

會是什麼目的?如果存在這樣的構造,那麼我想,對於擴展ParentClass的任何屬性,我認爲新的ChildClass將具有默認值。首先創建一個ChildClass對象。

對於繼承類,您始終可以使用基類類型容器。您不應該嘗試將對象的實例重新創建爲派生類型,而應該創建派生類型的實例,並且如果要能夠交換對象,則使用基類型容器:

ParentClass parentClass = new *ChildClass*() { ParentStr = "something" } 
ChildClass childClass = (ChildClass)parentClass 

我不推薦這些命名約定:)

+0

這是*我的理由:我已經繼承了編碼器在二維數組中存儲了一堆數據庫數據的代碼。我想用DataTables替換它們,但我仍然希望代碼在此期間構建。作爲一個柺杖,我重新編碼的東西,我創建了一個適配器DataTable(一個子類),它提供了一個默認的2索引屬性(當然,我已經用'Obsolete'屬性標記)。因爲我打算轉換到標準DataTables,所以有些地方會有幫助,比如從DataTableExtensions中的ToTable()分配。 – transistor1