C # 인터페이스를 구현하고 이벤트 인수를 확장 할 수 있습니까?

레몬 시드

다음 인터페이스가 있다고 가정합니다.

interface IBook
{
    event EventHandler<EventArgs> PageChanged;
}

이 클래스에 대해 어려움없이 구현할 수 있습니다.

class Novel : IBook
{
    public event EventHandler<EventArgs> PageChanged;

    protected void OnPageChanged()
    {
        EventHandler<EventArgs> pageChanged = PageChanged;
        if (pageChanged != null) pageChanged(this, EventArgs.Empty);
    }
}

그러나 이제 Encyclopedia다음과 같이 정의 된 객체가있는 경우 :

class Encyclopedia : IBook
{
    public class EncyclopediaEventArgs : EventArgs
    {
        public int Volume
        {
            get { return volume; }
        }

        private int volume;

        public EncyclopediaEventArgs(int volume)
        {
            this.volume = volume;
        }
    }

    public event EventHandler<EncyclopediaEventArgs> PageChanged;

    protected void OnPageChanged(int volume)
    {
        EventHandler<EncyclopediaEventArgs> pageChanged = PageChanged;
        if (pageChanged != null) pageChanged(this, new EncyclopediaEventArgs(volume));
    }
}

의 모든 작동이 Book있지만 이벤트 인수 필드가 추가되었습니다 Volume. 컴파일 할 때 오류가 발생합니다 (예상대로).

오류 CS0738 : '백과 사전'은 인터페이스 멤버 'IBook.PageChanged'를 구현하지 않습니다. 'Encyclopedia.PageChanged'는 'System.EventHandler'와 일치하는 반환 유형이 없기 때문에 'IBook.PageChanged'를 구현할 수 없습니다.

에서 파생 된 경우에도 반환 유형이 아니기 IBook.PageChanged때문에 구현할 수 없음 을 나타 냅니다.System.EventHandler<System.EventArgs>EncyclopediaEventArgsSystem.EventArgs

따라서 내 질문 은 이벤트 인수에 Encyclopedia추가 Volume필드를 추가 하는 클래스를 파생시킬 수 있습니까?

(왜 이것이 잘못된 설계 / 아키텍처 결정인지 아닌지에 대한 모든 토론을 환영합니다!)

수수께끼

이렇게하는 것은 매우 간단합니다.

interface IBook<T> where T : EventArgs
{
    event EventHandler<T> PageChanged;
}

class Novel : IBook<EventArgs> { ... }

class Encyclopedia : IBook<Encyclopedia.EncyclopediaEventArgs> { ... }

여전히 평야가 필요한 경우 IBook다음을 수행합니다.

interface IBook { }

interface IBook<T> : IBook where T : EventArgs
{
    event EventHandler<T> PageChanged;
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

클래스 C는 인터페이스 A를 확장하는 인터페이스 B를 구현합니다. C가 A를 구현한다고 말할 수 있습니까?

분류에서Dev

EventTarget 인터페이스를 확장 할 수 있습니까?

분류에서Dev

자신의 인수를 받아들이는 인터페이스를 확장하는 클래스를 어떻게 구현할 수 있습니까?

분류에서Dev

clojure definterface가 다른 인터페이스를 확장 할 수 있습니까?

분류에서Dev

인터페이스 메소드를 구현하지 않고도 어떻게 활용할 수 있습니까?

분류에서Dev

클래스가 인터페이스를 구현하고 해당 인터페이스 뒤에서 논리를 실행할 수 있습니까?

분류에서Dev

특정 인터페이스를 구현하는 클래스 만 메서드를 호출 할 수 있는지 확인 하시겠습니까? 씨#?

분류에서Dev

하위 항목 만 구현할 수있는 인터페이스를 모델링 할 수 있습니까?

분류에서Dev

하위 항목 만 구현할 수있는 인터페이스를 모델링 할 수 있습니까?

분류에서Dev

추상은 인터페이스를 어떻게 구현할 수 있습니까?

분류에서Dev

C # 메서드 호출이 인터페이스를 구현하는 클래스를 해당 인터페이스로 캐스팅 할 수 없습니다.

분류에서Dev

추상 클래스를 확장 메서드가있는 인터페이스로 대체 할 수 있습니까?

분류에서Dev

어떻게 일반적인 하나로 아닌 일반적인 인터페이스를 확장 할 수 있습니까?

분류에서Dev

클래스가 하나의 속성으로 인터페이스를 구현하는 방법은 다른 인터페이스도 구현할 수 있습니까?

분류에서Dev

항목을 제네릭 유형으로 캐스트 할 수없는 이유는 무엇입니까? 제네릭 유형이 인터페이스이고 항목이 해당 인터페이스를 구현하는지 확인한 후?

분류에서Dev

Typescript, 어떤 유형없이 인터페이스를 확장 할 수 있습니까?

분류에서Dev

DRY 원칙을 위반하지 않고 인터페이스에서 메서드의 인수를 어떻게 확인할 수 있습니까?

분류에서Dev

이름을 모르고 특정 인터페이스를 구현하는 클래스를 어떻게 호출 할 수 있습니까?

분류에서Dev

다른 어셈블리에서 구현하는 인터페이스를 보호 할 수 있습니까?

분류에서Dev

인터페이스를 직접 구현하는 것을 금지 할 수 있습니까?

분류에서Dev

PHP 클래스가 구현중인 인터페이스 유형의 객체를 반환 할 수 있습니까?

분류에서Dev

Cinelerra 인터페이스를 수정할 수 있습니까?

분류에서Dev

iptables는 브리지의 인터페이스를 구별 할 수 있습니까?

분류에서Dev

RTTI가 없으면 C ++에서 컬렉션의 개체가 인터페이스를 구현하는지 런타임에 어떻게 확인할 수 있습니까?

분류에서Dev

이벤트를 필터링하거나 재 할당하는 프로세스를 확인할 수있는 방법이 있습니까? 그리고 / 또는 OS가 스스로 할 수 있습니까?

분류에서Dev

UML : 컴포넌트는 어떻게 인터페이스를 구현할 수 있습니까?

분류에서Dev

'n'정의 된 인터페이스에서 확장하고 TypeScript에서 새 자식 인터페이스를 만들 수 있습니까?

분류에서Dev

캐스트없이 일반 포인터를 확인할 수 있습니까?

분류에서Dev

클래스 A를 확장하고 일부 인터페이스를 구현해야하는 멤버 변수

Related 관련 기사

  1. 1

    클래스 C는 인터페이스 A를 확장하는 인터페이스 B를 구현합니다. C가 A를 구현한다고 말할 수 있습니까?

  2. 2

    EventTarget 인터페이스를 확장 할 수 있습니까?

  3. 3

    자신의 인수를 받아들이는 인터페이스를 확장하는 클래스를 어떻게 구현할 수 있습니까?

  4. 4

    clojure definterface가 다른 인터페이스를 확장 할 수 있습니까?

  5. 5

    인터페이스 메소드를 구현하지 않고도 어떻게 활용할 수 있습니까?

  6. 6

    클래스가 인터페이스를 구현하고 해당 인터페이스 뒤에서 논리를 실행할 수 있습니까?

  7. 7

    특정 인터페이스를 구현하는 클래스 만 메서드를 호출 할 수 있는지 확인 하시겠습니까? 씨#?

  8. 8

    하위 항목 만 구현할 수있는 인터페이스를 모델링 할 수 있습니까?

  9. 9

    하위 항목 만 구현할 수있는 인터페이스를 모델링 할 수 있습니까?

  10. 10

    추상은 인터페이스를 어떻게 구현할 수 있습니까?

  11. 11

    C # 메서드 호출이 인터페이스를 구현하는 클래스를 해당 인터페이스로 캐스팅 할 수 없습니다.

  12. 12

    추상 클래스를 확장 메서드가있는 인터페이스로 대체 할 수 있습니까?

  13. 13

    어떻게 일반적인 하나로 아닌 일반적인 인터페이스를 확장 할 수 있습니까?

  14. 14

    클래스가 하나의 속성으로 인터페이스를 구현하는 방법은 다른 인터페이스도 구현할 수 있습니까?

  15. 15

    항목을 제네릭 유형으로 캐스트 할 수없는 이유는 무엇입니까? 제네릭 유형이 인터페이스이고 항목이 해당 인터페이스를 구현하는지 확인한 후?

  16. 16

    Typescript, 어떤 유형없이 인터페이스를 확장 할 수 있습니까?

  17. 17

    DRY 원칙을 위반하지 않고 인터페이스에서 메서드의 인수를 어떻게 확인할 수 있습니까?

  18. 18

    이름을 모르고 특정 인터페이스를 구현하는 클래스를 어떻게 호출 할 수 있습니까?

  19. 19

    다른 어셈블리에서 구현하는 인터페이스를 보호 할 수 있습니까?

  20. 20

    인터페이스를 직접 구현하는 것을 금지 할 수 있습니까?

  21. 21

    PHP 클래스가 구현중인 인터페이스 유형의 객체를 반환 할 수 있습니까?

  22. 22

    Cinelerra 인터페이스를 수정할 수 있습니까?

  23. 23

    iptables는 브리지의 인터페이스를 구별 할 수 있습니까?

  24. 24

    RTTI가 없으면 C ++에서 컬렉션의 개체가 인터페이스를 구현하는지 런타임에 어떻게 확인할 수 있습니까?

  25. 25

    이벤트를 필터링하거나 재 할당하는 프로세스를 확인할 수있는 방법이 있습니까? 그리고 / 또는 OS가 스스로 할 수 있습니까?

  26. 26

    UML : 컴포넌트는 어떻게 인터페이스를 구현할 수 있습니까?

  27. 27

    'n'정의 된 인터페이스에서 확장하고 TypeScript에서 새 자식 인터페이스를 만들 수 있습니까?

  28. 28

    캐스트없이 일반 포인터를 확인할 수 있습니까?

  29. 29

    클래스 A를 확장하고 일부 인터페이스를 구현해야하는 멤버 변수

뜨겁다태그

보관