2017-05-31 83 views
-1

假設我有一個從水果類如何根據不同的參數創建不同類的不同對象?

擴展蘋果類和我有一個從水果類擴展橙類太

兩個班有兩個不同的構造

蘋果有蘋果(大小,顏色,味道,重量);橙色有橙色(大小,半徑,直徑);

每個對象有自己獨特的方法,我必須調用

如何創建不同的情況下,僅僅通過創建水果類?根據不同的參數?像

Fruit a = new Fruit(int size, int colour, String taste, int weight); To create apple 
Fruit a = new Fruit(int size, int radius, int diameter); To create orange 

我該怎麼做?請幫助

UPDATE:

我明白我必須用工廠,但我並沒有訓練做,我怎麼使用工廠在C#實現上述

因爲我的老闆只說他希望用戶在不關心水果名稱的情況下將參數輸入水果類。他告訴我用java調用工廠,我該怎麼做?

+2

簡而言之:你不知道。構造函數是特定於水果類型的,那麼爲什麼你會試圖在基類水果中強制它們的構造函數呢?如果你知道你正在創建一個Apple(因爲你正在調用Apple特定的構造函數),爲什麼不用新的Apple()代替Fruit()呢? 您可能想看看一個工廠,您可以在其中實施CreateFruit並帶有多個重載,以根據簽名返回特定的水果。 –

+0

'每個對象都有自己獨特的方法 - 但你的問題被標記爲[多態] - 我認爲你需要去查找那個單詞。另外,我認爲你需要向老闆尋求澄清。他被問到的你毫無意義。 – Jamiec

+0

他的意思是他希望Fruit對象根據用戶輸入的參數自動將對象分類爲Apple或Orange,而不必聲明蘋果或橙色 – user2399158

回答

1

使用從派生類的構造函數:

Fruit a = new Apple(size, colour, taste, weight); 

基於更新後的問題,如果你使用一個工廠,你的工廠將返回果型,所以我沒有看到過簡單地使用多少好處構造函數重載:

public class Fruit 
{ 
    public Fruit(int size, int colour, string taste, int weight) { } 
    public Fruit(int size, int radius, int diameter) { } 
} 
+0

我不能那樣做,我不得不從Fruit類打電話 – user2399158

+0

我已根據您更新的問題更新了我的答案。例如,每個不同的構造函數都可以在Fruit類上設置一個enum屬性來表示它是否是蘋果,橙色等。 – ZippyZippedUp

0

你可以試試這個:

public class Fruit 
{ 
    public static Fruit CreateFruit(string v1, string v2) 
    { 
     return new Apple(v1, v2); 
    } 

    public static Fruit CreateFruit(string v1, int v2, int v3) 
    { 
     return new Orange(v1, v2, v3); 
    } 
} 

public class Apple : Fruit 
{ 
    string var1 { get; set; } 
    string var2 { get; set; } 

    public Apple(string v1, string v2) 
    { 
     this.var1 = v1; 
     this.var2 = v2; 
    } 
} 


public class Orange : Fruit 
{ 
    string var1 { get; set; } 
    int var2 { get; set; } 
    int var3 { get; set; } 

    public Orange(string v1, int v2, int v3) 
    { 
     this.var1 = v1; 
     this.var2 = v2; 
     this.var3 = v3; 
    } 
} 
+0

您是否意味着使您的工廠方法變爲靜態?與他們的實例這將是*怪異的 - - 你需要一個'水果'的實例來調用它們。 – Jamiec

+0

你是對的。我已將方法CreateFruit更改爲靜態 – daniell89

+0

技術上完全正常,但它基本上將工廠包裝在基類中,唯一原因是符合看似無意義的規則。當然不是你的錯,你直接回答了這個問題:) – Flater