인터페이스 방법의 스텔스와 디스플레이 실현

9532 단어 이음매
먼저 코드를 보고 아래에 1, 2, 3, 4, 5, 6, 7, 8, 9, 10이 표시된 곳의 출력 상황을 알아맞혀 보세요.
참고: Snippet Compiler Live 2008 편집기 사용
 
 1   public static void RunSnippet()
2 {
3 ITest a = new Test();
4 a.Say(); // 1
5

6 a = new App();
7 a.Say(); // 2
8

9 a = new Strong();
10 a.Say(); // 3
11

12 Test t = new Test();
13 t.Say(); // 4
14

15 t = new App();
16 t.Say(); // 5
17 ((ITest)t).Say(); // 6
18

19 t = new Strong();
20 t.Say(); // 7
21 ((ITest)t).Say(); // 8
22

23 Strong s = new Strong();
24 s.Say(); // 9
25 ((ITest)s).Say(); // 10
26 }

27
28 public class Test : ITest
29 {
30 public void Say()
31 {
32 Console.WriteLine("Test Says.");
33 }
34
35 void ITest.Say()
36 {
37 Console.WriteLine("ITest Says.");
38 }
39 }
40
41 public class App : Test, ITest
42 {
43 new public void Say()
44 {
45 Console.WriteLine("App says.");
46 }
47 }
48
49 public class Strong : Test/*, ITest*/
50 {
51 /*
52 new public void Say()
53 {
54 Console.WriteLine("Strong says.");
55 }
56 */

57 }
58
59 public interface ITest
60 {
61 void Say();
62 }

출력 결과는 다음과 같습니다.
1  ITest Says.(인터페이스 디스플레이 구현, 인터페이스 유형은 인터페이스 방법만 호출)
2  App Says.(Test를 계승했지만 인터페이스를 다시 계승하고 인터페이스 방법을 다시 썼다)
3  ITest Says.(Test 상속, 인터페이스 디스플레이 구현 방법도 상속)
4  Test Says.(Test 객체, 인터페이스 방법 대신 객체 메소드 호출)
5  Test Says.(왜 App Says가 아닐까? App이 다시 실현하는 것은 인터페이스 방법이고 Test의 인터페이스 방법은 다시 쓸 수 없기 때문에 Test의 대상인 방법을 호출한다)
6  App says.(왜 ITest Says가 아닙니까? App은 인터페이스 방법을 실현했고 인터페이스는 App 인터페이스 방법을 사용했기 때문입니다. 게다가 Test의 디스플레이 인터페이스 방법은 개인적인 것입니다.)
7  Test Says.(Test 유형 메서드를 상속함)
8  ITest Says.(인터페이스 유형 디스플레이 인터페이스 방법 호출)
9  Test Says.(Test 객체 메서드 상속)
10 ITest Says.(인터페이스 유형 디스플레이 인터페이스 방법 호출)
왜 위의 결과가 나왔을까요?
하나의 유형이 인터페이스를 실현할 때 C#를 컴파일할 때 하나의 유형의 대상 방법과 인터페이스 방법을 동시에 생성했는데 그들 두 인용의 실현은 같은 방법이다.
인터페이스 구현 방법을 표시하고 유형의 대상 방법을 동시에 실현할 때 구분되며 인터페이스 방법의 접근 속성은 컴파일러가 메타데이터를 생산할 때 개인으로 지정하여 유형의 실례 호출을 방지합니다.이렇게 인터페이스 표시 방법은 인터페이스 형식으로만 호출할 수 있고, 반대로 인터페이스 형식으로 호출할 때 인터페이스 방법만 호출할 수 있다.
다른 한편, 디스플레이 인터페이스 방법은 파생류에 의해 다시 쓸 수 없다. 디스플레이 인터페이스 방법은 유형의 대상 모델의 일부분에 속하지 않기 때문에 하나의 인터페이스(한 그룹의 행위나 방법)를 하나의 유형에 연결하고 노출 행위/방법을 피하는 방식이다.
프레임 디자인(두 번째 버전) CLR Via C# 14장 5절(14.5) 인터페이스 방법의 스텔스 및 디스플레이 구현(비하인드 디테일) 참조

좋은 웹페이지 즐겨찾기