2009-04-24 3 views

답변

12

아니요, Objective-C 및 일부 다른 언어와 다릅니다. 명시 적으로 인터페이스 구현을 선언해야합니다.

+0

인터페이스로 변환하면 예외가 발생합니다. –

+4

예, 클래스가 명시 적으로 인터페이스를 구현하지 않는다면 인터페이스로 구현하려고하면 예외가 발생합니다. –

+1

상속 체인의 어딘가에 나타나는 개체에만 개체를 ​​캐스팅 할 수 있습니다 (상속 체인에 구현 된 인터페이스 포함). – Powerlord

4

IDoo에 멤버가있는 경우이 코드는 컴파일되지 않습니다. IDoo에 멤버가 없다면, 캐스트는 안전합니다 (그러나 제한된 사용이 가능함).

+0

"명백한 제한 d 사용 "+1 –

+0

OP는 * 클래스에 인터페이스 *에 대한 모든 올바른 메소드/서명이있는 경우 *를 분명하게 지정하지만, 그렇지 않은 경우 OPERATOR가 중요합니다. –

2
public class A 
{ 
    public void DoSomething(); 
} 

public interface IDoSomething 
{ 
    void DoSomething(); 
} 

public class B : A, IDoSomething 
{ } 

B 만족이 기본적으로 자동으로 발생하지 않습니다 C#을에서 작동하도록 오리 타이핑을 필요로한다.

그래도이 작업을 수행 할 수있는 것은 libraries입니다.

3

에서 상속하여 IDoSomething.DoSomething

17

오리

뭘 관용구의 이름을 딴 "duck-typing"(라고 암시하는 "그것이 오리처럼 보이는, 그리고 오리처럼 꽥꽥 있다면, 그것이 오리해야합니다"를 입력).

duck-typing을 사용하면 관련 멤버를 구현 한 후에 인터페이스 구현이 암시 적으로 처리되지만 .NET은 현재이를 지원하지 않습니다.

미래에 계획된 응급 동적 언어 기능을 사용하면 가까운 미래에 런타임에서 기본적으로 지원되는 경우 놀라지 않을 것입니다. ,

흥미롭게 IDoo myDoo = DuckTyping.Cast<IDoo>(myFoo)

일부 퀴즈 : 그 동안

, 당신은이 같은 오리 입력 캐스트를 할 수 있도록 것이다, a library such as this과 반사를 통해 오리 입력을 종합하는 수 오늘 C#에서 오리 타이핑이 사용되는 작은 장소가 있습니다 - foreach 연산자. 크쥐시토프 콸 리나는 states 그것은 foreach 운영자에 의해 열거되기 위해, 클래스는 반드시 : a) 방법 MoveMext :

는 매개 변수를 취하지 않으며 두 멤버가있는 형식을 반환하는 공용 메서드 GetEnumerator를 제공 매개 변수를 사용하지 않고 은 부울을 반환하고 b) 속성 개체를 반환하는 게터가있는 현재.

그는 IEnumerable이나 IEnumerator을 언급하지 않습니다. 열거 형 클래스를 만들 때 이러한 인터페이스를 구현하는 것이 일반적이지만 인터페이스를 삭제하지만 구현을 그대로두면 클래스는 여전히 foreach으로 열거 가능합니다. 빌라! 오리 타이핑! (Example code here.)

+0

+1 퀴즈! 좋은 사람 –

+0

고마워. 오리를 타이핑하는 것을 점검 할 시간이 없었고 항상 잊어 버렸습니다. 당신은 은판에 관한 정보를 제공했습니다. –