메서드 오버라이딩을 했을 때 최 상위 부모로 이동하는 키워드는 없나요?

안녕하세요.
정말 기초적인 질문일 수 있겠지만 프로그래밍을 하던 도중 궁금해 져서 여쭤봅니다.

public class Animal
    {
        public void SayName()
        {
            Console.WriteLine("나는 동물이다.");
        }
    }
    public class Dog : Animal
    {
        public void SayName()
        {
            Console.WriteLine("나는 개다");
        }
    }

    public class Poodle : Dog
    {
        public void SayName()
        {
            base.SayName(); // Animal을 호출 하고 싶음
            Console.WriteLine("나는 푸들이다");
        }
    }

이러한 상속 관계에서 저는 Poodle 에서 바로 Animal의 SayName으로 접근하고 싶습니다.

최상위 부모로 이동하는 키워드가 있는가. 없다면 이유는 무엇이고
만약 Dog의 SayName은 실행하지 않으면서 Animal의 SayName만 추가로 실행하고 싶다면 어떻게 쓰는 것이 일반적인 방법인가 알려주시면 감사하겠습니다.

(제가 생각해 본 방법으로는 Dog 클래스에 Animal의 SayName 그러니까 base.SayName을 해주는 메서드를 선언 해 준 뒤 그것을 실행시키는 방법도 있을 거라고 생각합니다.)

1개의 좋아요

(this as Animal).SayName(); 하면 됩니다.

2개의 좋아요

그런데 virtual 메소드의 경우 위와 같이 되지 않습니다. Poodle는 Dog이고 Dog는 Animal이므로 Poddle → Dog → Animal순의 초기화 및 단계 실행이 올바릅니다.

2개의 좋아요

갑사합니다!

1개의 좋아요

혹시 Poddle → Dog → Animal 로 순차적으로 진행 한다는것이 이해가 잘 안되어서 그런데 추가 설명 부탁드려도 괜찮을까요… 죄송합니다

1개의 좋아요

이해하기 쉽게 설명하기가 저의 능력 부족으로 어려운데요, 가장 간단한 접근으로 @ChanMin0334 님의 예시 코드가 적절한 것 같습니다.

Poodle은 Dog이면서 Animal이므로 SayName의 올바른 출력은 “나는 푸들이다” 이거나 “나는 동물이다”, “나는 개다”, "나는 푸들이다"가 자연스럽습니다. 이는 각 상속된 클래스의 메서드에서 base.SayName()으로 달성할 수 있고요, 이것을 전처리 하느냐 후처리 하느냐는 것은 base.SayName() 위치로 결정할 수 있습니다. (일반적으로 상위 메서드를 호출하면서 상태값이 변경될 수 있으므로 전처리가 맞습니다.)

2개의 좋아요

추가 설명 감사합니다!
도움이 많이 되었습니다!

1개의 좋아요