2012-05-02 3 views
9

여기있는 누군가가 내가 틀린 가정을 설명 할 수 있기를 바라고 있습니다. C# 4.0에는 2 개의 인터페이스와 그 둘 모두를 구현하는 클래스가 있습니다. 난상속받지 않는 다른 인터페이스로 인터페이스 전송하기

public interface IFirstInterface 
    { 
     void Method1(); 
    } 

    public interface ISecondInterface 
    { 
     void Method2(); 
    } 

    public class InterfaceImplementation : IFirstInterface, ISecondInterface 
    { 
     public void Method1() { } 
     public void Method2() { } 
    } 

    public class SomeClass 
    { 
     public void SomeMethod() 
     { 
      IFirstInterface first = new InterfaceImplementation(); 
      first.Method1(); 

      // Shouldn't the next line return null? 
      ISecondInterface second = first as ISecondInterface; 
      // second is not null and the call to Method2() works fine 
      second.Method2(); 
     } 
    } 

: 방법에서 나는 두 인터페이스를 구현하고 어떻게 든 다음 코드와 같이 두 번째 인터페이스로 성공적으로 캐스팅 할 수있는 클래스를 사용하여 인스턴스화 첫 번째 인터페이스의 유형의 변수를 선언 왜 캐스팅이 성공했는지 이해하려합니다. 예, 클래스는 두 인터페이스를 구현하지만 첫 번째 변수는 IFirstInterface (ISecondInterface에서 상속받지 않음)로 선언되므로 캐스팅은 여전히 ​​실패해야합니다.

'as'를 사용하지 않는 등의 다른 방법으로 코드를 재구성하려고 시도했지만 캐스트가 여전히 성공적입니다.

무엇이 누락 되었습니까?

답변

7

예를 들어, 어떤 유형의 기능을 호출하기 전에 유형 유형을 테스트 해 보았습니다. 첫 번째 생성은 두 인터페이스를 모두 지원하는 완전한 "InterfaceImplementation"을 생성합니다. 그러나 선언 된 유형의 첫 번째 인터페이스 만 사용하고 있습니다. 따라서 "첫 번째"객체의 관점에서 보았을 때 IFirstInterface 구현과 관련된 모든 것에 만 관심이 있습니다.

이제 두 번째로 ... 개체를 만들었지 만 여전히 물어볼 수 있습니다 ... 그건 그렇고 ... 또한 두 번째 인터페이스입니까? 그렇다면 ...

IFirstInterface first = new InterfaceImplementation(); 

if(first is ISecondInterface) 
    // typecast since the second interface is legit, then call it's method 2 
    ((ISecondInterface)first).Method2(); 
+0

이것은 내가 무슨 일이 일어나고 있는지를 확인합니다. 감사합니다 –

+0

많은 많은 감사, 정말 필요했습니다. +1 (가능한 경우 +10). – Arjang

0

구체적인 개체의 관점에서 보면 "나는 IFirstInterface이지만 저는 ISecondInterface입니다"라고 말할 수 있습니다. 이게 네가 말하는거야? 앞에서 설명한 질문은 상속/구현 체인 내부에서만 구현 될 것입니다.

1

당신이 놓치고있는 유일한 이유는 정확하게 그 의미가되는 방법이며 문제가 아닌 유용한 기능입니다. 캐스팅 할 때 코드를 기본적으로 "이 객체의 유형이 무엇인지 알았는지 신경 쓰지 않고 유형 T로 변환 할 수 있는지 알고 싶습니다"라고 생각할 수 있습니다. 이 경우 기본 객체의 유형은 InterfaceImplementation이기 때문에 현재 IFirstInterface이라는 사실과 관계없이 대답은 예, ISecondInterface으로 변환 될 수 있습니다.

0

다형성에 오신 것을 환영합니다. 객체 first은 항상 InterfaceImplementation의 인스턴스가 될 것입니다. 그것을 참조하는 방법은 그 대상이 진정으로 "있는 것"에 영향을 미치지 않습니다. 이것이 추상화의 개념이 전반적으로 작동하는 방식입니다.

3

first 포인트의 실제 유형은 두 인터페이스를 모두 구현합니다. 따라서 분명히 Method1Method2을 개체에서 사용할 수 있습니다.

정적 유형 firstMethod1에 액세스 할 수 있습니다. 고정 유형 second 만 있으면 Method2에 액세스 할 수 있습니다. 인터페이스 중 하나를 사용하여 객체에 대한 참조를 선언하고 선택한 계약 (인터페이스)을 충족하는 객체로 인스턴스를 보도록 선택합니다.

InterfaceImplementation은 두 인터페이스를 모두 구현하므로 두 인터페이스 중 하나를 사용하여 인스턴스를 참조 할 수 있습니다.

관련 문제