20.04.07 23:36 작성
·
400
2
안녕하세요 선생님, 좋은 강의 잘 듣고 있습니다. 항상 감사합니다.
"다중상속"영상을 잘 보았습니다. 해당 코드에서 AttackUnit은 name을 멤버변수로 가진 반면에, Flyable은 name을 멤버변수로 가지지 않았습니다.
이를 눈여겨보고, 저는 다음과 같이 코드를 바꿔보았습니다. AttackUnit과 Flyable 모두에서 name을 멤버변수로 가지도록 하고, 마찬가지로 FlyableAttackUnit을 만들어 두 class로부터 다중상속했습니다;
그 결과 문제없이 작동되었는데요. 이와 관련해서 질문입니다.
(1) Flyable에서는 name을 멤버변수로 설정하지 않으신 것은, 혹시 중복을 막기 위한 의도셨나요?
(2) 일반적으로 (제가 했던 것과 같이) 두 개의 부모 class의 멤버변수가 중복되더라도 문제가 발생하지 않는 것이 맞나요?
답변 2
2
2020. 04. 11. 09:03
안녕하세요
질문 주신 코드가 혹시 이렇게 되길 의도하셨던거 아닌가요?
위에 적으신 코드는 name 을 전달받기는 하지만 name 에 넣지는 않고 있어서요.
위 경우라도 Unit 클래스의 name 값이 있어서 가져다가 잘 표시해주기는 합니다.
왜냐하면 다중 상속을 받을 경우 상속 받은 순서대로 앞에서부터 뒤로 가면서 해당 값이 있는지 확인하고 있으면 쓰기 때문이지요.
하지만 만약 다른 예제에서 Flyable 과 같은 클래스가 단독으로 쓰인다면 name 멤버변수가 없기 때문에 에러가 발생합니다.
fly 함수에서는 self 에 있지도 않은 name 변수를 가져다 쓰고 있어서, 향후에 혼돈을 야기할 수도 있습니다.
Flying 클래스는 '날기 기능'만 구현하기 위해 name 을 정의하지 않았습니다.
2번째 답변은 아래 예제를 참고해주세요.
A 와 B 를 다중상속 받은 C 에서 name 을 찍으면 A 가 찍힙니다.
하지만 주석 처리된 대로 상속 순서를 B, A 로 바꾸면 B 가 찍히게 되지요.
코드상 에러가 있지는 않지만 같은 이름의 멤버변수가 있는 클래스를 다중 상속 시에는 사용자의 주의를 요하게 됩니다. ^^
0