2016-07-28 3 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"; 
    } 
} 

은 그때 만든 별도의 클래스 : 나는 포켓몬과 전투 형하지만 사이의 관계를 설정하는 방법에 대한 불확실 단지 다음을 수행 결국 유형.

부모의 초기 값을 변경하는 것만으로 하위 클래스를 만드는 것이 좋지 않습니까?

여기부터, 난 그냥 응용 프로그램을 개선하는 방법에 응용 프로그램에 대한

 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'와 같은 것을 전달할 수 있습니다. 두 종류의 포켓몬 용'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 예 공용 필드를 만드는 것은 좋지 않습니다. 그러나 이러한 값을 노출하려면 보호되는 대신 해당 속성을 공개로 설정할 수 있습니다. –