추상 클래스를 상속받는 추상 클래스 살펴보기

추상화 클래스는 하나 이상의 추상화 메서드 또는 클래스를 정의하는 것을 강제하도록 하고자 할 때 사용됩니다. 저도 개인적으로 간간히 사용하고 있고 닷넷 코어나 수많은 라이브러리에서도 쉽게 이것을 볼 수 있습니다.

그런데 만약 추상화된 클래스를 한번 더 추상화 하고 싶을 땐 어떻게 하면 될까요?

여기 일반적인 추상 클래스가 있습니다.

public abstract class ApplicationBase : Application
{
    protected abastract Window CreateShell();
}

또 추상 클래스를 선언하면 됩니다.

public abstract class SmartApplication : ApplicationBase
{

}

그리고 추상 클래스에서는 부모의 추상 메서드를 바로 구현하지 않아도 됩니다. 이런 경우 아래처럼 다음으로 상속을 받는 DotnetApplication에서 최종적으로 추상 메서드를 구현하면 됩니다.

public class App : SmartApplication
{
    protected override Window CreateShell()
    {
        return new MainWindow();
    }
}

그런데 여기서 만약 WpfApplication에서 추상 메서드를 먼저 구현하면 어떻게 될까요? 실제로 가능합니다.

public abstract class SmartApplication : ApplicationBase 
{
    protected override Window CreateShell()
    {
        return new Window();
    }
}

이렇게 앞에서 추상 메서드가 구현된다면 App에서는 더이상 CreateShell() 추상 메서드를 구현하는 것이 반드시 해야 할 의무가 아니게 됩니다.

public class App : SmartApplication
{
    // 신기하게도 추상메서드를 구현하지 않고도 에러가 발생하지 않죠.
}

물론 추상 메서드를 구현한다고 해도 문제 될 것은 없습니다. 단지 SmartApplication에서 구현한 추상 메서드 자체가 없는 것이나 마찬가지인 것 처럼 동작할 것입니다.

읽어주셔서 감사합니다.
:smile:

좋아요 2

오…!!! 추상클래스를 상속받는 클래스 중에 아무나 추상 함수를 구현해주면 오류가 안나나보네요?

한번도 생각해보지 못한… ㅋㅋㅋㅋ

혹시 실제로 추상클래스를 2번 상속 받는 일반클래스가 있는 오픈소스나 참고할 코드를 알고계신 분이 계실까요~~??

좋아요 2

@마수리 링크 보내드립니다!

좋아요 1

참고로… C# 버젼 몇 부터 였는지는 모르겠지만 다음 처럼 abstract를 구현한 메서드의 반환 타입이

class MainWindow : Window 관계일 때

MainWindow를 반환해줘도 컴파일 오류 없이 정상 컴파일 됩니다.

    protected override MainWindow CreateShell()
    {
        return new MainWindow();
    }
좋아요 3

@dimohy 오호!! 좋은 히스토리 감사합니다. :smile: