카테고리 없음

자식들에 공통으로 들어가는 필드값이 있을경우

이더23 2024. 10. 1. 14:24

밑에 코드와 같이 자식 객체들을 생성해줄때마다 공통적으로 문자열 타입의 name을 받아서 _Name이라는 필드에 값을 넣어주는데 그거를 부모에 생성자를 만들어 줘서 사용을 하면은 자식 타입의 또 다른 직업을 만들어줄때 따로 안넣어주고 그냥 : base(name)만 넣어주면 된다.

 

바꾸기 전 코드

public Knight(string name)
{
    _Lv = 1;
     _Name = name;
    _Job = "Knight";
    _Atk = 5;
    _Def = 10;
    _Speed = 5;
    _Hp = 100;
    _Mp = 50;

    SkillListAdd(new Skill("알파 스트라이크", "공격력 * 2 로 하나의 적을 공격합니다.", 10, 2.0f, 1));
    SkillListAdd(new Skill("더블 스트라이크", "공격력 * 1.5 로 2명의 적을 랜덤으로 공격합니다.", 15, 1.5f, 2));
}

 

public Archor(string name)
{
    _Lv = 1;
    _Name = name;
    _Job = "Archor";
    _Atk = 8;
    _Def = 7;
    _Speed = 10;
    _Hp = 80;
    _Mp = 50;

    SkillListAdd(new Skill("헤드샷", "공격력 * 2.5 로 하나의 적을 공격합니다.", 10, 2.5f, 1));
    SkillListAdd(new Skill("다중사격", "공격력 * 2.0 로 2명의 적을 랜덤으로 공격합니다.", 15, 2.0f, 2));
}

 

바꾼 후의 코드(부모 생성자 만들어 준다음에 자식들에 붙여주면 된다.)

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

 

public Knight(string name) : base(name)
{
    _Lv = 1;
    _Job = "Knight";
    _Atk = 5;
    _Def = 10;
    _Speed = 5;
    _Hp = 100;
    _Mp = 50;

    SkillListAdd(new Skill("알파 스트라이크", "공격력 * 2 로 하나의 적을 공격합니다.", 10, 2.0f, 1));
    SkillListAdd(new Skill("더블 스트라이크", "공격력 * 1.5 로 2명의 적을 랜덤으로 공격합니다.", 15, 1.5f, 2));
}

 

이와 같이 넣어주면 밑에 따로 _Name을 안적어 줘도 알아서 붙는다.

 

그럼 여기서 의문이 하나가 들 수 있다.

부모에서 생성자를 사용해서 매개변수로 string name을 받아왔는데 자식한테도 왜 string name을 적어야 하나요?

라는 의문이 들수 있는데 그거는 부모 클래스와 자식 클래스의 생성자 호출 순서매개변수 전달 방식 때문입니다.

 

자식 객체가 생성되면, 자식 생성자가 먼저 실행되고, 그 후에 : base(name)을 통해 부모 생성자가 호출됩니다. 자식 생성자가 매개변수로 받은 name 값부모 생성자의 매개변수로 전달하여, 부모 생성자에서 그 값을 처리하게 됩니다.

 

이러한 순서때문에 위와같이 사용을 해야한다.