본문 바로가기

C# 개인 공부 기록용/어소트락 게임아카데미 - C# 무료강의[2019] 총48강

[C# 강의 29화]오버라이딩

출처 : https://www.youtube.com/watch?v=2bJyfyVRaiM&list=PL4SIC1d_ab-Y-bBKojxhtFWwNpawMM1h5&index=29

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

class FightUnit
{
    // 외부 자식 내부 까지만
    // 디폴트 접근 제한 지정자는 private
    protected string Name = "NONE";
    protected int AT = 10;
    // protected int ItemAT = 10;
    protected int HP = 100;

    //public static virtual void Test()
    //{
    //    this가 없어서 virtual 안됨.
    //}

    // 이 문법의 핵심은
    // 자식에서 만약 나의 /*같은 이름의 함수나 프로퍼티*/를 재구현했다면
    // 자식의 형태의 /*같은 이름의 함수나 프로퍼티*/를 호출해 주세요.
    // 이걸 오버라이딩
    // 다형(동적바인딩)의 핵심 문법중 하나이다.
    public virtual int GetAT()
    {
        Console.WriteLine("FIGHTUNIT의 GETAT");
        return AT;
    }

    // 프로퍼티는 VIRTUAL 된다.
    // 접근제한자는 부모와 자식이 같아야한다.
    public virtual int DMGAT
    {
        get
        {
            Console.WriteLine("FIGHTUNIT의 GETAT");
            return AT;
        }
    }

    // 업캐스팅
    // DamageFightUnit
    // 첫번째 상속의 개념을 지키기 위해서
    // (코드 재활용성) (코드를 적게 치고 최대한의 효과를 누리고 싶다.)
    public void Damage(FightUnit _OtherFightUnit)
    {
        // 각자 플레이어면 플레이어의 것
        // _OtherFightUnit.AT 
        int AT = _OtherFightUnit.DMGAT;
        Console.WriteLine(_OtherFightUnit.Name + "에게" + _OtherFightUnit.AT + "만큼의 데미지를 입었습니다.");
        HP -= AT;
    }

    // 생성자는 오버라이딩 할 수 없다.
    //public virtual FightUnit()
    //{

    //}

    // 오버로딩
    // DamagePlayer
    //public void Damage(Player _OtherFightUnit, int _DamagePlus)
    //{
    //    //_OtherFightUnit.AT;

    //    Console.WriteLine(_OtherFightUnit.Name + "에게" + _OtherFightUnit.AT + "만큼의 데미지를 입었습니다.");

    //    HP -= _OtherFightUnit.AT;
    //}
}

class Player : FightUnit
{
    int itemAT = 5;

    // 나는 부모님의 GetAT를 재구현 했다.
    public override int DMGAT
    {
        get
        {
            Console.WriteLine("플레이어의 GETAT");
            return AT + itemAT;
        }
    }

    public Player(string _Name)
    {
        Name = _Name;
    }
}

class Monster : FightUnit
{
    int MonsterLv = 2;

    public Monster(string _Name)
    {
        Name = _Name;
    }

    public override int GetAT()
    {
        Console.WriteLine("몬스터의 GETAT");
        return AT + MonsterLv;
    }
}

namespace _30Overrading
{
    class Program
    {
        static void Main(string[] args)
        {
            // 
            Player NewPlayer = new Player("플레이어");
            Monster NewMonster = new Monster("몬스터");
            FightUnit NewUnit = NewMonster;
            // FightUnit NewFight = new FightUnit();

            // NewPlayer.GetAT();

            NewPlayer.Damage(NewMonster);
            NewMonster.Damage(NewPlayer);

        }
    }
}