2010-03-23 146 views
4

我想知道如何做到這一點,考慮下面的類如何實例化一個基類,然後將其轉換爲派生類?

public class Fruit 
{ 
    public string Name { get; set; } 
    public Color Color { get; set; } 
} 
public class Apple : Fruit 
{ 
    public Apple() 
    { 

    } 
} 

我如何實例化一個新的成果,但上溯造型蘋果,有沒有辦法來實例化了一堆水果,使他們的蘋果與名稱&顏色集。我是否需要手動深度複製?

當然這失敗

Fruit a = new Fruit(); 
a.Name = "FirstApple"; 
a.Color = Color.Red; 
Apple wa = a as Apple; 
System.Diagnostics.Debug.Print("Apple name: " + wa.Name); 

我需要在一個水果傳遞給AppleCTor和手動設置名稱和顏色(或1-n個屬性),是否有更好的設計來做到這一點?

+3

爲什麼要在地球上做這個? – Welbog 2010-03-23 18:38:35

+0

@welbog,prolly永遠不想;)它只是在我們的設計中表現出一個缺陷,水果作爲模板,蘋果延伸它,其他工作者使用水果。 – Eric 2010-03-23 19:49:18

回答

5

在模型中,一個Fruit不是Apple - 如果你想要一個Apple,實例化一個。或者,如果要創建使用Fruit作爲起點的Apple,請創建可接受FruitApple的構造函數。

您應該注意,繼承層次結構中的中間類可實例化(而不是抽象)的對象模型通常是一個壞主意。在某些情況下,這樣的層次結構可能是適當的 - 但我發現它們通常比他們的價值更麻煩。真的很想知道FruitApple是否需要具體和實例化。

+0

我試過了,這看起來不太合適,對我說這應該重新設計 公衆蘋果(水果水果) { base.Color = fruit.Color; //等 } – Eric 2010-03-23 19:52:31

4

它看起來像你試圖想出一種方法來實例化從公共基類派生的許多可能的對象之一。通常這是通過抽象工廠模式完成的。有關更多詳細信息和實施示例,請參閱:http://en.wikipedia.org/wiki/Abstract_factory_pattern

+0

這個答案有什麼問題?我認爲這對OP來說是一個很好的資源。 – 2010-03-23 19:12:05

+0

只是鏈接的答案是皺起了眉頭。 – 2010-03-23 20:21:36

+0

這是一個公平的警察。在這裏相對較新,道歉。 – 2010-03-23 20:29:40

6

默認情況下,a實例是Fruit的實例,不能轉換爲Apple。它的不是Apple實例,並且永遠不會。但是,您可以實施explicit cast

2

如果你創建一個水果,它不是蘋果。你不能上傳它,因爲它可能不會擁有它需要的所有屬性。如果你想要一個蘋果,就創建一個蘋果。你不需要傳遞任何東西。

我懷疑下面的工作:

Fruit a = new Apple(); 
System.Diagnostics.Debug.Print("Apple name: " + a.Name); 

...但我不是一個Java程序員。這基本上是你在C++中所做的。 (請務必閱讀在另一個答案給出抽象工廠模式的鏈接,特別是如果你需要實例一堆水果的不同亞型的。)