38. 명시적 인터페이스 구현의 디스패치와 접근 규칙

난이도 중 해설 보기 →

결함을 모두 찾고 원인·수정안·더 나은 설계를 제시하라. 마커 (A)(B) 는 주목 위치 힌트다.

결함 코드 · C#
// 주제: 명시적 인터페이스 구현(explicit interface implementation)의 디스패치와 접근 규칙.
//
// 과제:
//  1) 아래 프로그램의 출력을 정확히 예측하라.
//  2) public 메서드 Move()와 두 개의 명시적 구현 IWalker.Move()/ISwimmer.Move()가
//     어떻게 공존하며, 각 호출이 무엇으로 디스패치되는지 설명하라.
//  3) 명시적 구현 멤버가 인스턴스에서 직접 호출되지 않고 인터페이스 타입(캐스트/
//     인터페이스 변수/제네릭 제약)을 통해서만 접근되는 이유를 설명하라.
//  4) 두 인터페이스가 같은 시그니처를 요구할 때 명시적 구현이 왜 필요한지 설명하라.

using System;

interface IWalker { string Move(); }
interface ISwimmer { string Move(); }

class Amphibian : IWalker, ISwimmer
{
    public string Move() => "walk(public)";
    string IWalker.Move() => "walk(IWalker)";
    string ISwimmer.Move() => "swim(ISwimmer)";
}

static class Mover
{
    public static string CallMove<T>(T t) where T : IWalker => t.Move();
}

class Program
{
    static void Main()
    {
        Amphibian a = new Amphibian();

        Console.WriteLine(a.Move());              // (1)
        Console.WriteLine(((IWalker)a).Move());   // (2)
        Console.WriteLine(((ISwimmer)a).Move());  // (3)

        IWalker w = a;
        ISwimmer s = a;
        Console.WriteLine(w.Move());              // (4)
        Console.WriteLine(s.Move());              // (5)

        Console.WriteLine(Mover.CallMove(a));     // (6) 제네릭 제약 T:IWalker
    }
}
내 리뷰 · C#
내 답안 · 자동 저장

작성 후 위 해설 보기에서 모범 해설과 대조하세요.