2016-07-28 43 views
0

我目前正在C#中使用一个非常简单的Pokémon应用程序。我是如何设置的神奇宝贝和他们的战斗类型,但我之间的关系不确定的只是最终做了以下内容:继承口袋妖怪仅在继承时更改值

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"; 
    } 
} 

我那么做单独的类只有改变的特定弱点和力量方式。

class Fire : Pokemon 
{ 
    public Fire(int number, string name) : base(number, name) 
    { 
     weakness = "Water"; 
     strength = "Grass"; 
    } 
} 

这是不好的礼仪创建子类的唯一目的是简单地改变父母的一些初始值?

从这里开始,我只是打算做的时候,关于如何提高应用程序的应用程序“创造”口袋妖怪

 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'那样传递一些东西。你甚至可以将它设置为接受一个'列表'用于两种类型的宠物小精灵 – 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是的,不建议公开领域。但是如果你想公开这些值,你可以公开这些属性而不是保护。 –