오늘 팀작업 도중 서로 작업하던 내용을 팀원들과 합치게 되었다.

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

반응형