2017-05-31 12 views
-1

は、私はフルーツクラス異なるパラメータに基づいて異なるクラスの異なるオブジェクトを作成する方法は?

から延びるアップルのクラスを持っていると私はあまりにもフルーツクラスから拡張オレンジクラス

両方のクラスが2つの異なるコンストラクタを持っている

アップルは、アップル(サイズ、色を、持っていると仮定すると、味、重量); オレンジ色はオレンジ(サイズ、半径、直径)です。

各オブジェクトには、私はJUST FRUITのクラスを作成し、別のインスタンスを作成するにはどうすればよい

を呼び出す必要があり、独自のユニークな方法を得ましたか。異なるパラメータに基づいていますか? like

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固有のコンストラクタを呼び出すので)、Fruit()の代わりにApple()を新しくしないのはなぜですか? いくつかのオーバーロードを含むCreateFruitを実装して、シグニチャに基づいて特定の果実を返すことができるFactoryを見てみるとよいでしょう。 –

+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

私はそれを行うことはできません、私はフルーツクラスから電話する必要があります – user2399158

+0

あなたの更新された質問に基づいて私の答えを更新しました。それぞれ異なるコンストラクタは、例えば、フルーツクラスの列挙型プロパティを設定して、リンゴ、オレンジなどを示すことができます。 – 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

関連する問題