Day17 - 상속,추상 class
심화 과제 1
Trainer라는 클래스를 만들고, 해당 구현 과제를 추상 클래스를 활용하여 진행하려 합니다. 다음 구현사항에 맞추어 Trainer클래스를 완성시켜 주시기 바랍니다.
Monster라는 추상 클래스를 새로 하나 만들고, 해당 클래스의 필드로는 정수형 레벨, 열거형 몹타입, 그리고 문자열 이름을 넣어서 만들어 주시기 바랍니다. Monster 추상 클래스에 BaseAttack이라는 abstract 메소드도 추가하여 주시기 바랍니다.
abstract class Monster
{
public int MonsterLevel;
public string MonsterName;
public MobType MonsterMobType;
//abstract 함수는 내용을 쓸수가 없다.
public abstract void BaseAttack();
}
class 객체 : Monster
{
//override 꼭 있어야함
public override void BaseAttack()
{
~내용
}
}
abstract함수는 내용을 사용할수는 없다. 상속 받은 클래스의 abstract함수가 꼭 있어야 하므로
협업 할 때 꼭 써야 할때 사용하면 좋을거같다.
abstract함수 사용할경우 override를 통해 각 클래스꺼를 쓸수 있게 된다.
심화 과제 2
이 Monster 클래스를 상속받는 Pikachu, Squirtle, Bulbasaur, Charmander 네 가지의 클래스를 만들어 주시기 바랍니다. Pikachu의 BaseAttack에는 '전광석화', Squirtle는 '물총발사', Bulbasaur는 '덩굴채찍', Charmander는 '화염방사' 를 콘솔에 출력하는 기능을 각각 제작하여 주시기 바랍니다. 각각 몬스터들의 생성자에는 인자값으로 이름과 레벨을 받을 수 있게 하고, 몹타입은 본인 취향 적절한 타입을 기입하여 주시기 바랍니다.
//오버라이드
class Pikachu : Monster
{
public override void BaseAttack()
{
Console.WriteLine("전광석화");
}
public Pikachu(MobType mobType,string name,int level) : base(mobType , level, name)
{
this.MonsterMobType = mobType;
this.MonsterName = name;
this.MonsterLevel = level;
}
}
class Squirtle : Monster
{
public override void BaseAttack()
{
Console.WriteLine("물총발사");
}
public Squirtle(MobType mobType, string name, int level) : base(mobType, level, name)
{
this.MonsterMobType = mobType;
this.MonsterName = name;
this.MonsterLevel = level;
}
}
class Bulbasaur : Monster
{
public override void BaseAttack()
{
Console.WriteLine("덩굴채찍");
}
public Bulbasaur(MobType mobType, string name, int level) : base(mobType, level, name)
{
this.MonsterMobType = mobType;
this.MonsterName = name;
this.MonsterLevel = level;
}
}
class Bulbasaur : Monster
{
public override void BaseAttack()
{
Console.WriteLine("덩굴채찍");
}
public Bulbasaur(MobType mobType, string name, int level) : base(mobType, level, name)
{
this.MonsterMobType = mobType;
this.MonsterName = name;
this.MonsterLevel = level;
}
}
//enum class 위에 선언
public enum MobType
{
Normal, Fire, Water, Grass, electricity
}
class Monster
{
~내용
public MobType MonsterMobType;
}
먼저 class명을 만들고 어떤 class를 상속 받을지를 추가한다
(Monster 을 상속받는 Pikachu 클래스)
class Pikachu:Monster
{
~내용
}
생성자를 생성하는 부분에서 부모 클래스를 참조 하기 위해 base를 사용한다.
심화 과제 3
Trainer 클래스에 6개의 몬스터형을 담을 수 있는 배열을 만들고, 트레이너 생성자에는 자동으로 피카츄를 배열의 첫 번째에 담기게 하는 코드를 작성하여 주시기 바랍니다. Trainer 클래스의 메소드로는, 몬스터를 인자값으로 받아 추가하는 기능, 만약 6마리를 초과해서 추가하려 하면, 추가하지 않고 경고문을 내는 메소드를 하나 제작해주시기 바랍니다. 이를 제작하기 위해 추가 필드가 필요하다면 추가 작성하시길 바랍니다.
그리고 배열 속 보유중인 모든 몹들이 가진 BaseAttack을 전부 실행하는 AllAttack이라는 메소드를 작성하세요.
class Trainer
{
public string TrainerName;
public string StartingName;
public Monster[] TotalMonster ;
//배열의 크기를 담을 변수
//0번째의 피카츄를 담을거라 1부터 시작
int arrsize = 1;
public Trainer(string trainername, string monstername)
{
this.TrainerName = trainername;
this.StartingName = monstername;
TotalMonster = new Monster[6];
}
//피카츄 클래스의 객체를 인자값으로 사용하면 배열0번째의 피카츄 객체가 들어감
public Trainer(Pikachu pikachu)
{
TotalMonster = new Monster[6];
TotalMonster[0] = pikachu;
}
//배열의 크기를 담을 변수가 6보다 크면 생성 안함
public void AddMonster(Monster monster)
{
if (arrsize >= 6)
{
Console.WriteLine("경 고 : arrsize 6됌");
}
else if (arrsize < 6)
{
TotalMonster[arrsize] = monster;
arrsize++;
}
}
//반복문으로 출력
//? : null 조건문 연산자
public void AllAttack()
{
for (int i = 0; i < TotalMonster.Length; i++)
{
TotalMonster[i]?.BaseAttack();
}
}
}
AllAttack() 함수 for구문에 TotalMonster.Length를 arrsize를 적어도 무방했다. 만약 null일경우 건너 뛰는 ? 사용했다.
? : 앞에 null일경우 뒤에꺼 실행 하지마라
또한 앞에 null 들어갈 수 있어야 한다
예)
//가능
int[] a = null; => null 들어갈수있음
a?.ToString();
//불가능
int a = 0; => null이 들어갈수가 없음
a?.ToString();
만약 TotalMonster[0].BaseAttack() => 값 할당 했음
TotalMonster[1].BaseAttack() => 값 할당 안했음
for (int i = 0; i < 2; i++)
{
TotalMonster[i]?.BaseAttack();
}
값 있는 TotalMonster[0].BaseAttack() 실행되지만
값 없는 TotalMonster[1].BaseAttack() 건너뛴다.
심화 과제 5
메인에서 Trainer를 하나 만든 후, Trainer 객체에 Charmander 한마리를 이름은 '파이리', 레벨은 5로 하여 추가하는 코드를 작성하세요. Trainer의 AllAttack 메소드를 호출하여 트레이너가 가진 모든 몹의 공격이 콘솔에 출력되게 하세요.
Pikachu pikachu = new Pikachu(MobType.electricity, "피카츄", 3);
Charmander charmander = new Charmander(MobType.Fire, "파이리", 5);
Bulbasaur bulbasaur = new Bulbasaur(MobType.Normal, "이상해 씨", 1);
Squirtle squirtle = new Squirtle(MobType.Water, "꼬부기", 2);
Trainer trainer = new Trainer(pikachu);//0
trainer.AddMonster(charmander);//1
trainer.AddMonster(bulbasaur);//2
trainer.AddMonster(squirtle);//3
trainer.AddMonster(squirtle);//4
trainer.AddMonster(squirtle);//5
trainer.AddMonster(charmander);//6부터 추가 안됌
//배열의 각 클래스를 담아
//각클래스의 BaseAttack() 가져옴
trainer.AllAttack();
//출력
trainer.ShowFirstMob();
일부로 배열6 추가하게 담아서 오류가 있는지 확인해보았다.
AddMonster() 함수가 실행돼서 6이상의 배열은 생성 돼지 않았다.