2017-01-14 2 views
1

だから、私はすべてのアイテムが他のクラスを継承しているインベントリシステムをC#で作成しています。現在私はいくつかのテストクラスに取り組んでいます。そのうちの1つはフィッシュです。 Fishはアイテム(上位レベルのクラス)から継承する消耗品から継承します 注:消耗品は基本的にスタック可能なアイテムです。継承のthis()とbase()の使用

私は消耗品クラスで2つのデフォルトコンストラクタを作成したい、引数を取らない1:

public Consumable() : base() { 
    quantity = 1; 
} 

をちょうど1

そして、もう一つの引数、数量をとるものに数量を設定します:

public Consumable(int Quantity) : this() { 
    if (quantity <= maxStack) 
     quantity = Quantity; 
    else 
     quantity = maxStack; 
} 

作成時に数量を設定します。今私は、上記のコードでこの()を使用すると、これを独自のデフォルトの引数のないコンストラクタを使用するように強制するだろうと考えましたが、そうではないようです。これは私が魚を持っているものです。

public Fish() : base() { 
    name = "fish"; 
    ID = 1; 
    variant = 0; 
    maxStack = 20; 
    desc = "A Fish of some kind"; 
    rarity = ItemRarity.Common; 
} 

public Fish(int QTY) : base(QTY) { } 

私は起こるしたいどのような私は、それは消耗品(QTY)を呼び出し、その後、基本を設定するために魚を()呼び出したい魚が(QTYをint型)が呼び出されたときに、あります量を設定することもできます。

現在しかし、ときの代わりに魚の魚(QTYをint型)、それは消耗品を(呼び出し、消耗品(QTY)を呼び出し、呼び出された)()

が、これは私はように動作するように取得する方法はあります探している?

+1

があなたの代わりに、静的なファクトリメソッドを使用して考えられていますか? – Dai

+2

デフォルトコンストラクタのコードを 'InitDefaults'メソッドに抽出し、両方のコンストラクタから呼び出すことができます –

+0

静的ファクトリメソッドが何であるか分かりません – SuperMeip

答えて

2

EDIT:いくつかのコメントですでに提案されているように、ここでは両方のコンストラクタから呼び出されるinitメソッドを使用して解決できる可能性があります。 Fish(qty)は、基本コンストラクタと独自のInitメソッドを呼び出すようになりました(Fish()と同じ)。

public Fish() : base() { 
    Init(); 
} 

public Fish(int QTY) : base(QTY){ 
    Init(); 
} 

private void Init(){ 
    name = "fish"; 
    ID = 1; 
    variant = 0; 
    maxStack = 20; 
    desc = "A Fish of some kind"; 
    rarity = ItemRarity.Common; 
} 
+0

私は、あなたの答えの周りにいくつかの文脈を追加してほしいかもしれません。コードのみの回答は理解しにくいです。あなたの投稿にさらに情報を追加することができれば、これはAskerと将来の読者に役立ちます。 – RBT

1

CLRは、最初にChildclassのみでBaseclassインスタンスを作成します。そしてそれに影響を与える方法はありません。あなたの場合、メソッドInitializeを作成することを提案します。 .net fiddle example

消耗クラス

public void Initialize(){ 
    Console.WriteLine("Consumable.Initialize()"); 
    quantity = 1; 
} 

public void Initialize(int Quantity){ 
    Console.WriteLine("Consumable.Initialize(QTY)"); 

    if (quantity <= maxStack) 
     quantity = Quantity; 
    else 
     quantity = maxStack; 
} 

と魚

public Fish(int QTY){ 
    Initialize(QTY); 
} 

public void Initialize(){ 
    Console.WriteLine("Fish.Initialize()"); 
    name = "fish"; 
    ID = 1; 
    variant = 0; 
    maxStack = 20; 
} 

public void Initialize(int QTY) { 
    Console.WriteLine("Fish.Initialize(QTY)"); 
    Initialize(); 
    base.Initialize(QTY);  
} 

出力:

enter image description here

関連する問題