2016-07-28 11 views
0

私は現在C#で非常に単純なポケモンアプリケーションを開発中です。私はポケモンとその戦いのタイプとの関係を設定する方法についての不確実だったが、私はちょうど次をやってしまった:継承時の値の変更のみ

abstract class Pokemon 
{ 
    private int number; 
    private string name; 
    protected string weakness; 
    protected string strength; 

    public Pokemon(int number, string name) 
    { 
     this.number = number; 
     this.name = name; 
     weakness = "none"; 
     strength = "none"; 
    } 
} 

私はその後だけの具体的な弱さと強さを変更するにはポケモンを継承別々のクラスを作りましたタイプ。

親の初期値の一部を変更するという唯一の目的でサブクラスを作成するのは悪い礼儀ですか?

ここにからアプリケーションまたはどのように継承を適切に使用する方法を改善する方法についてのアプリケーション

 pokemon = new Pokemon[6]; 
     pokemon[0] = new Grass(001, "Bulbasaur"); 
     pokemon[1] = new Grass(002, "Ivysaur"); 
     pokemon[2] = new Grass(003, "Venusaur"); 
     pokemon[3] = new Fire(004, "Charmander"); 
     pokemon[4] = new Fire(005, "Charmeleon"); 
     pokemon[5] = new Fire(006, "Charizard"); 

ためのポケモンを「作成」する一切のアドバイスははるかに高く評価されたときに、私は次のことを行う上でつもり: )

+0

もう一つの可能​​な解決策は、コンストラクタで列挙型を使用することです。そのため、あなたは 'PokemonType.Grass'や' PokemonType.Fire'のようなものを渡します。 2種類のポケモンのために 'List 'を受け入れるように設定することもできます。 – Hill

答えて

1

継承は正常に見えますが、改善が必要な場合があります。まず、脆弱性と強度のために保護されたフィールドを定義する必要はなく、代わりに保護されたプロパティを使用します。第二に、弱さ/強さのために文字列タイプを使用することは最良の選択ではないようです。私はEnum型で行くだろう。

enum PokemonComponent { 
    Water, 
    Grass 
} 

abstract class Pokemon 
{ 
    private int number; 
    private string name; 
    protected Pokemon(int number, string name) 
    { 
     this.number = number; 
     this.name = name; 
    } 
    protected abstract PokemonComponent Weakness { 
     get; 
    } 
    protected abstract PokemonComponent Strength { 
     get; 
    } 
} 

class Fire : Pokemon 
{  
    public Fire(int number, string name) : base(number, name) 
    { 
    } 
    protected override PokemonComponent Weakness { 
     get { 
     return PokemonComponent.Water; 
     } 
    } 
    protected override PokemonComponent Strength { 
     get { 
     return PokemonComponent.Grass; 
     } 
    } 
} 
+0

「弱さ」と「強さ」を公開してください。 – lokusking

+1

@ lokusking OPがこれらのプロパティを公開するかどうかはわかりません。おそらく彼は望んでいるだろうが、コード内に保護されたフィールドだけが表示されているので、私はプロパティも保護していた。 –

+1

@Shelbyはいパブリックフィールドを作成することはお勧めしません。しかし、それらの値を公開したい場合は、それらのプロパティをprotectedではなくpublicにすることができます。 –

関連する問題