C# 클래스가 하나의 인터페이스에서 암시적 및 명시적으로 상속할 수 있는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/253058

문제

오늘 나는 하나의 C# 클래스가 암시적 및 명시적 방식으로 하나의 인터페이스를 상속할 수 있다는 것을 발견했습니다.이것은 나를 놀라게 한다.C#이 이러한 방식으로 작동하는 경우 한 인스턴스는 다른 방식으로 참조될 때 다르게 동작할 수 있습니다.

interface IFoo
{
    void DoSomething();
}

class Foo : IFoo
{
    #region IFoo Members
    public void DoSomething()
    {
        Console.WriteLine("do something implicitly");
    }
    #endregion

    #region IFoo Members
    void IFoo.DoSomething()
    {
        Console.WriteLine("do something explicitly");
    }
    #endregion
}


        Foo f = new Foo();
        f.DoSomething();

        ((IFoo)f).DoSomething();

위의 코드 실행 및 출력

do something implicitly
do something explicitly

나는 C#의 이러한 디자인이 동작의 불일치를 만든다고 생각합니다.아마도 하나의 C# 클래스가 암시적 또는 명시적 방식으로 하나의 인터페이스에서 상속할 수 있지만 둘 다 상속할 수는 없는 것이 필수일 수 있습니다.

C#이 그런 방식으로 설계된 이유가 있나요?

도움이 되었습니까?

해결책

당신의 예가 있습니다 ~ 아니다 IFOO를 암시 적으로 그리고 명시 적으로 구현하십시오. ifoo.dosometing () 만 명시 적으로 구현합니다. 당신은 당신의 클래스에 dosomething ()라는 새로운 방법이 있습니다. 이름과 매개 변수가 같은 것을 제외하고는 ifoo.dosomething과 관련이 없습니다.

다른 팁

인터페이스를 구현하는 모든 클래스에는 a가 있습니다 매핑 해당 수업의 회원과 인터페이스 멤버 사이. 수업이라면 명시 적으로 인터페이스 멤버를 구현하면 명시 적 구현이 언제나 인터페이스에 매핑됩니다. 명시적인 구현이 없으면 암시 적 구현이 예상되며 해당 계면이 인터페이스에 매핑됩니다.

클래스가 인터페이스와 동일한 멤버 이름과 관련 유형을 갖는 경우 하지만 또한 인터페이스의 해당 멤버를 명시 적으로 구현 한 다음 클래스의 "암시 적"구현을 명시 적으로 구현합니다. 그렇지 않습니다 인터페이스의 구현을 고려합니다 조금도 (명시 적 구현이 호출하지 않는 한).

클래스가 동일한 멤버 이름/유형으로 여러 인터페이스를 구현하는 각 경우의 다른 의미 외에도 하나의 인터페이스 만 있더라도 수업 자체 단독 인터페이스와 동일한 멤버/유형을 가질 수 있지만 여전히 다른 것을 의미하는 암시 적 인터페이스가있는 것으로 간주됩니다.

이것은 충돌이있을 때 더 유연하게 만듭니다. 특히,보십시오 IEnumerator 그리고 IEnumerator<T> - 둘 다 a Current 속성이지만 다른 유형. 너 가지다 두 가지를 구현하기 위해 명시 적 인터페이스 구현을 사용합니다 (및 일반 양식은 비 게 릭 형태를 확장합니다).

다중 상속 : 다른 목적을 위해 동일한 방법을 정의하는 두 인터페이스에서 파생되면 어떻게됩니까?

  interface IMoveable
  {
    public void Act();
  }

  interface IRollable
  {
    public void Act();
  }

  class Thing : IMoveable, IRollable
  {
    //TODO Roll/Move code here

    void IRollable.Act()
    {
      Roll();
    }

    void IMoveable.Act()
    {
      Move();
    }
  }

여러분, 답변해 주셔서 감사합니다.

"C# 클래스는 동시에 암시적 및 명시적 방식으로 하나의 인터페이스를 상속할 수 있습니다"는 사실 환상입니다.실제로 하나의 클래스는 한 번에 하나의 인터페이스를 상속할 수 있습니다.

원래 질문에서 "DoSomething" 메서드는 IFoo 인터페이스를 "암시적으로 구현"하는 것처럼 보이지만(이 메서드는 실제로 VS2008에 의해 생성됨) 실제로는 그렇지 않습니다.IFoo 인터페이스를 명시적으로 구현하면 "DoSomething" 메서드는 동일한 서명을 제외하고 IFoo와 아무 관련이 없는 일반적인 메서드로 변합니다.

나는 아직도 그것이 C#의 까다로운 디자인이고, 실수로 사용하기 쉽다고 믿습니다.이런 코드가 있어요

        Foo f = new Foo();
        f.DoSomething();

이제 아래 코드로 리팩토링하고 싶습니다.완벽하게 괜찮은 것 같지만 실행 결과는 다릅니다.

        Action<IFoo> func = foo => foo.DoSomething();
        func(f);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top