《CLR via C\#》독서 노트 의 인터페이스
13199 단어 독서 노트
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 }
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로그'메타프로그램 루비 버전 2'3장 읽기동적 방법 Object#send 호출 방법은 약간 메모와 Object#send obj.send(:my_method, 3) Object#send를 사용하면 어떤 방법으로든 호출할 수 있습니다. privete 방법을 호...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.