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

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

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

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

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: