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#
내 답안 · 자동 저장
작성 후 위 해설 보기에서 모범 해설과 대조하세요.