《CLR via C\#》독서 노트 의 인터페이스

13199 단어 독서 노트
제1 3 장 인터페이스
2013-02-27
13.5 암시 적 및 디 스 플레이 인터페이스 방법 실현   1.암시 적 인터페이스의 실현   2.인터페이스의 실현 보이 기 13.8 같은 방법 이름과 서명 을 가 진 여러 개의 인 터 페 이 스 를 실현 한다. 13.9 디 스 플레이 인터페이스 형식 방법 으로 컴 파일 시 형식 보안 강화
 
Todo:인 터 페 이 스 를 언제 사용 하고 클래스 를 언제 사용 합 니까?
 
13.5 암시 적 및 디 스 플레이 인터페이스 방법 실현
되돌아오다
?명시 적 인터페이스 와 암시 적 인터페이스 의 관계
 
1.암시 적 인터페이스의 실현
 1     class SimpleType : IDisposable

 2     {

 3         public void Dispose() { Console.WriteLine("Dispose"); }

 4     }

 5 

 6     class Program

 7     {

 8         static void Main(string[] args)

 9         {

10             SimpleType st = new SimpleType();

11             //    Dispose  

12             st.Dispose();

13             //  IDisposable Dispose  

14             IDisposable d = st;

15             d.Dispose();

16         }

17     }

위 에서 호출 한 것 은 같은 방법 입 니 다.출력 은 모두:Dispose 입 니 다.
2.인터페이스의 실현 보이 기
1     class SimpleType : IDisposable

2     {

3         public void Dispose() { Console.WriteLine("public Dispose"); }

4         //    

5         void IDisposable.Dispose() { Console.WriteLine("IDisposable.Dispose"); }

6     }

출력 결과:
public Dispose
IDisposable.Dispose
메모:C\#디 스 플레이 인터페이스 방법 을 정의 합 니 다.접근 성 을 정의 할 수 없습니다.컴 파일 러 는 접근 성 을 private 로 설정 합 니 다.그것 을 호출 하려 면 인터페이스 형식의 변 수 를 통 해서 만 진행 할 수 있 습 니 다.
13.8 같은 방법 이름과 서명 을 가 진 여러 개의 인 터 페 이 스 를 실현 한다.
되돌아오다  
두 개의 인 터 페 이 스 는 같은 방법 이름과 서명 방법 을 가지 고 있 으 며,반드시'인 터 페 이 스 를 표시 하 는 방법'으로 이 루어 져 야 한다.
1     interface IWindow { object GetMenu();}

2     interface IRestaurant { object GetMenu();}

3     class Mario : IWindow, IRestaurant

4     {

5         object IWindow.GetMenu() { return null; }

6         object IRestaurant.GetMenu() { return null; }

7     }

13.9 디 스 플레이 인터페이스 형식 방법 으로 컴 파일 시 형식 보안 강화
되돌아오다  
어떻게 인터페이스 하 는 방법 은 System.Object 형식의 매개 변 수 를 받 아들 이거 나 값 을 되 돌 릴 때 컴 파일 시의 유형 안전성 을 잃 고 포장 도 발생 합 니 다.다음 코드 를 보십시오.
 1     struct SomeValueType : IComparable

 2     {

 3         private int _x;

 4         public SomeValueType(int x) { _x = x; }

 5         public int CompareTo(Object other)

 6         { return (_x - ((SomeValueType)other)._x); }

 7     }

 8 

 9     class Program

10     {

11         static void Main(string[] args)

12         {

13             SomeValueType v = new SomeValueType(0);

14             object o = new object();

15             int n = v.CompareTo(v); //     

16             n = v.CompareTo(o);   //InvalidCastException  

17         }

18     }

다음 과 같이 변경 하여 상기 오 류 를 피 할 수 있 습 니 다.
 1     struct SomeValueType : IComparable

 2     {

 3         private int _x;

 4         public SomeValueType(int x) { _x = x; }

 5         public int CompareTo(SomeValueType other) //      

 6         { return (_x - other._x); }

 7         int IComparable.CompareTo(Object other) //          

 8         { return CompareTo((SomeValueType)other); }

 9     }

10 

11     class Program

12     {

13         static void Main(string[] args)

14         {

15             SomeValueType v = new SomeValueType(0);

16             object o = new object();

17             int n = v.CompareTo(v); //      

18             n = v.CompareTo(o);   //       

19         }

20     }

그러나 인터페이스 형식 변 수 를 정의 하면 오류 가 발생 할 수 있 습 니 다.다음 코드 를 보십시오.
 1     class Program

 2     {

 3         static void Main(string[] args)

 4         {

 5             SomeValueType v = new SomeValueType(0);

 6             IComparable c = v;   //  

 7             object o = new object();

 8             int n = c.CompareTo(v); //     

 9             n = c.CompareTo(o);    // InvalidCastException  

10         }

11     }

좋은 웹페이지 즐겨찾기