오늘 팀작업 도중 서로 작업하던 내용을 팀원들과 합치게 되었다.
git hub를 이용하여 작업하였고 우리 조는 collaborate 방식을 선택했다.
처음에는 처음 해보는 fork방식을 선택했지만 모종의 사건이 있고 난 뒤 collaborate 방식으로 바꾸게 되었다.
암튼 팀원들과 작업물을 합치고(merge) 난 뒤에 팀원들이 짠 코드를 하나씩 보는데
추상 클래스(abstract)를 사용한 것을 보았다. 나는 평소에 잘 쓰지 않던 클래스여서 궁금해서 자세히
보게 되었는데 그 아래 상속받은 자식 클래스에 오버라이딩(overriding) 한 것을 보고 코드를
더 줄여서 쓸 수 있겠다 싶어서 고치게 되었다.
public abstract void UseSkill(Character player, Goblin _goblin);
public class FireballSkill : Skill
// 파이어볼 스킬 클래스
{
public FireballSkill() : base("파이어볼", 20, 3) { }
// 파이어볼 스킬의 기본 속성 초기화
public override void UseSkill(Character player, Goblin _goblin)
// 파이어볼 스킬 사용 시의 동작 정의
{
if (player.Mp >= MpCost)
{
Console.WriteLine($"3의 MP를 소모하여 '{Name}' 시전!");
player.Mp -= MpCost;
// 몬스터에게 피해 입히기
int damageDealt = Damage;
_goblin.Hp -= damageDealt;
Console.WriteLine($"{_goblin.Name}에게 {damageDealt}의 피해를 입혔습니다.");
Console.WriteLine($"{_goblin.Name}의 남은 체력: {_goblin.Hp}");
}
else
{
Console.WriteLine("마나가 부족하여 스킬을 시전 할 수 없습니다.");
}
}
}
public class PowerStrikeSkill : Skill
// 파워스트라이크 스킬 클래스
{
public PowerStrikeSkill() : base("파워스트라이크", 25, 5) { }
public override void UseSkill(Character player, Goblin _goblin)
// 파워스트라이크 스킬 사용 시의 동작 정의
{
if (player.Mp >= MpCost)
{
Console.WriteLine($"5의 MP를 소모하여 '{Name}' 시전!");
player.Mp -= MpCost;
// 몬스터에게 피해 입히기
int damageDealt = Damage;
_goblin.Hp -= damageDealt;
Console.WriteLine($"{_goblin.Name}에게 {damageDealt}의 피해를 입혔습니다.");
Console.WriteLine($"{_goblin.Name}의 남은 체력: {_goblin.Hp}");
}
else
{
Console.WriteLine("마나가 부족하여 스킬을 시전 할 수 없습니다.");
}
}
}
public class SuperPunchSkill : Skill
// 짱짱펀치 스킬 클래스
{
public SuperPunchSkill() : base("짱짱펀치", 999, 10) { }
public override void UseSkill(Character player, Goblin _goblin)
// 짱짱펀치 스킬 사용 시의 동작 정의
{
if (player.Mp >= MpCost)
{
Console.WriteLine($"10의 MP를 소모하여 '{Name}' 시전!");
player.Mp -= MpCost;
// 몬스터에게 피해 입히기
int damageDealt = Damage;
_goblin.Hp -= damageDealt;
Console.WriteLine($"{_goblin.Name}에게 {damageDealt}의 피해를 입혔습니다.");
Console.WriteLine($"{_goblin.Name}의 남은 체력: {_goblin.Hp}");
}
else
{
Console.WriteLine("마나가 부족하여 스킬을 시전 할 수 없습니다.");
}
}
}
이렇게 되어있던 추상 클래스를 가상메서드로 바꿔서 다시 만들어 봤다.
public virtual void UseSkill(Character player, Goblin _goblin)
{
if (player.Mp >= MpCost)
{
Console.WriteLine($"{MpCost}의 MP를 소모하여 '{Name}' 시전!");
player.Mp -= MpCost;
// 몬스터에게 피해 입히기
int damageDealt = Damage;
_goblin.Hp -= damageDealt;
Console.WriteLine($"{_goblin.Name}에게 {damageDealt}의 피해를 입혔습니다.");
Console.WriteLine($"{_goblin.Name}의 남은 체력: {_goblin.Hp}");
}
else
{
Console.WriteLine("마나가 부족하여 스킬을 시전 할 수 없습니다.");
}
}
}
// 스킬 사용 메소드, 파생 클래스에서 구현
//스킬을 사용할 때의 동작을 나타냄
public class FireballSkill : Skill
// 파이어볼 스킬 클래스
{
public FireballSkill() : base("파이어볼", 20, 3) { }
// 파이어볼 스킬의 기본 속성 초기화
public override void UseSkill(Character player, Goblin _goblin)
// 파이어볼 스킬 사용 시의 동작 정의
{
base.UseSkill(player, _goblin);
}
}
public class PowerStrikeSkill : Skill
// 파워스트라이크 스킬 클래스
{
public PowerStrikeSkill() : base("파워스트라이크", 25, 5) { }
public override void UseSkill(Character player, Goblin _goblin)
// 파워스트라이크 스킬 사용 시의 동작 정의
{
base.UseSkill(player, _goblin);
}
}
public class SuperPunchSkill : Skill
// 짱짱펀치 스킬 클래스
{
public SuperPunchSkill() : base("짱짱펀치", 999, 10) { }
public override void UseSkill(Character player, Goblin _goblin)
// 짱짱펀치 스킬 사용 시의 동작 정의
{
base.UseSkill(player, _goblin);
}
}
이렇게 겹치는 부분을 가상메서드로 만들면 한번만 써놓고
앞으로도 스킬을 추가할 때 더욱 간편하게 만들 수 있다.
참고로 함수에 base 붙이는 부분은 상속한 부모 클래스 내부의 생성자를 명시적을 호출 할 수 있다고 한다.
[출처 : https://dochistory.tistory.com/87 ] bb
'Today I Learned' 카테고리의 다른 글
[내일배움캠프] C# 문법 종합반 - 팀프로젝트 완성(소감문) (2) | 2023.11.22 |
---|---|
[내일배움캠프] C# 문법 종합반 - 코드카타(약수의 합, 나머지 1되는 수 찾기) (1) | 2023.11.21 |
[내일배움캠프] C# 문법 종합반 - 알고리즘 코드카타(짝수와 홀수) (0) | 2023.11.17 |
[내일배움캠프] C# 문법 종합반 - 알고리즘 (Big O) (0) | 2023.11.16 |
[내일배움캠프] C# 문법 종합반 - 팀프로젝트 시작 (0) | 2023.11.15 |