다음 인터페이스가 있다고 가정합니다.
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>
EncyclopediaEventArgs
System.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] 삭제
몇 마디 만하겠습니다