Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
07-03 00:02
관리 메뉴

nomad-programmer

[Programming/C#] 인터페이스를 상속하는 인터페이스 본문

Programming/C#

[Programming/C#] 인터페이스를 상속하는 인터페이스

scii 2020. 9. 10. 20:11

인터페이스를 상속할 수 있는 것은 클래스뿐이 아니다. 구조체는 물론이고, 인터페이스도 인터페이스를 상속할 수 있다. 기존의 인터페이스에 새로운 기능을 추가한 인터페이스를 만들고 싶을 때 인터페이스를 상속하는 인터페이스를 만들면 된다. 
기존에 존재하는 인터페이스에 새로운 기능을 추가해도 되지만 다음의 경우처럼 인터페이스를 수정할 수 없을 때에는 인터페이스를 상속하는 인터페이스를 이용해야 한다.

  • 상속하려는 인터페이스가 소스 코드가 아닌 어셈블리로만 제공되는 경우 : .NET Framework SDK에서 제공하는 인터페이스들이 그 예이다. 어셈블리 안에 있기 때문에 인터페이스를 수정할 수 없다. 이인터페이스에 새로운 기능을 추가한 인터페이스를 만들고 싶으면 상속하는 수밖에 없다.
  • 상속하려는 인터페이스의 소스 코드를 갖고 있어도 이미 인터페이스를 상속하는 클래스들이 존재하는 경우 : 클래스는 반드시 인터페이스의 "모든" 메소드와 프로퍼티를 구현해야 한다. 인터페이스에 사소한 수정이라도 이루어지면 인터페이스를 상속하는 기존 클래스들은 소스 코드를 빌드할 때 컴파일 에러를 발생시킬 것이다. 이런 상황에서 기존의 소스 코드에 영향을 주지 않고 새로운 기능을 추가하기 위해서는 인터페이스를 상속하는 인터페이스를 이용하는 편이 좋다.

인터페이스가 인터페이스를 상속하기 위해 사용하는 문법은 클래스의 문법과 똑같다.

interface 파생 인터페이스 : 부모 인터페이스
{
    // 추가할 메소드 목록
}

당연한 이야기지만 파생 인터페이스는 부모 인터페이스에 선언된 모든 것을 그대로 물려받는다.

interface ILogger
{
    void WriteLog(string message);
}

다음과 같이 위의 인터페이스를 상속하는 새로운 인터페이스를 만든다고 해보자. IFormattableLogger 인터페이스는 ILogger에 선언되어 있는 void WriteLog(string message)와 void WriteLog(string format, params object[] args) 메소드 두 개를 갖게 된다.

interface IFormattableLogger : ILogger
{
    void WriteLog(string format, params object[] args);
}

인터페이스 상속 예제

using System;

namespace CSharpExample
{
    interface ILogger
    {
        void WriteLog(string message);
    }

    interface IFormattableLogger : ILogger
    {
        void WriteLog(string format, params object[] args);
    }

    class ConsoleLogger2 : IFormattableLogger
    {
        public void WriteLog(string message)
        {
            Console.WriteLine("{0} {1}", DateTime.Now.ToLocalTime(), message);
        }

        public void WriteLog(string format, params object[] args)
        {
            string message = string.Format(format, args);
            Console.WriteLine("{0} {1}", DateTime.Now.ToLocalTime(), message);
        }

    }

    class MainApp
    {
        static int Main(string[] args)
        {
            IFormattableLogger logger = new ConsoleLogger2();
            logger.WriteLog("I'm king of the world!");
            logger.WriteLog("{0} + {1} = {2}", 1, 1, 2);

            return 0;
        }
    }
}


/* 결과

2020-09-10 오후 7:54:01 I'm king of the world!
2020-09-10 오후 7:54:01 1 + 1 = 2

*/
Comments