2013-06-03 2 views
2

나는 몇 개의 하위 클래스가있는 상위 추상 클래스가 있습니다. 결국, 아이들 클래스의 진행 상황을 GUI의 진행률 막대를 통해 보여 주길 바란다.하위/상위 이벤트 발생

내가 현재 실현하고있는 것은 실현되지 않는 것으로, 이벤트 메소드 정의가 부모 클래스에서 각 자식 클래스가 덮어 쓸 가상 메소드로 선언 된 것입니다. 그래서 뭔가 같은 :

public abstract class Parent 
{ 
public event EventHandler someEvent; 

protected virtual void OnSomeEvent(object sender, EventArgs e) 
    { 
      EventHandler eh= someEvent; 
     if (eh!= null) 
     { 
      eh(this, e); 
     } 
    } 
} 

그리고 내 자식 클래스는 같은 있습니다

protected override void OnSomeEvent(object sender, EventArgs e) 
    { 
     base.OnSomeEvent(sender, e); 
    } 

를 이벤트는 자식 클래스 어딘가에서 발생합니다.

그러나 부모 클래스로 보는 것은 추상 클래스이므로 추상 클래스의 인스턴스를 만들 수 없기 때문에 GUI에서 이벤트를 수신 할 수 없습니다.

나는 코스를 완전히 벗어나거나 이것을하기위한 또 다른 방법이 있습니까?

+2

UI가 하위 인스턴스의 이벤트에 첨부되지 않는 이유는 무엇입니까? '부모 '로부터 상속 받으면'자식 '도 이벤트를 갖게됩니다. – qJake

+0

아이디어는 어떤 GUI가 이벤트를 발생 시켰는지 GUI가 알 필요가 없다는 것입니다[email protected] –

+0

그래서 부모에게 정적 이벤트 처리기를 원한다면 인스턴스가 하나뿐입니다. – qJake

답변

2

자식 인스턴스의 이벤트에 연결할 수 있습니다.

public abstract class Parent 
{ 
     public event Action Something; 

     public void OnSomething() 
     { 
      if (Something != null) 
      { 
       Something(); 
      } 
     } 
} 
public class Child : Parent 
{ 

} 

Child c = new Child(); 
c.Something +=() => Console.WriteLine("Got event from child"); 
c.OnSomething(); 
> Got event from child 

당신은 아이를 포함하는 Parent 유형으로 선언도 할 수

Parent c2 = new Child(); 
c2.Something +=() => Console.WriteLine("Got event from Parent type"); 
c2.OnSomething(); 
> Got event from Parent type 

추상 클래스는 (넣어 상속 모든 클래스에 복사됩니다 단지 코드 템플릿입니다 간단히). 모든 Child 클래스에는 Parent에있는 동일한 코드 사본이 포함되어 있다고 생각해보십시오.


각 인스턴스에 대해 고유 한 이벤트 처리기도 생성됩니다 (Child). 같을 것이다 Parent에서 파생 된 모든 Child들에 대한 정적 이벤트 핸들러를 갖는, 그리고 Child에는 코드를 필요로하지 않는다 : 다음

public abstract class Parent 
{ 
    public static event Action Something; 

    public static void OnSomething() 
    { 
     if (Something != null) 
     { 
      Something(); 
     } 
    } 
} 

을, 당신은 예를 들어, 다음과 같이 뭔가를 할 수 :

Parent.Something +=() => Console.WriteLine("This will be invoked twice."); 

Child c = new Child(); 
Child c2 = new Child(); 
c.OnSomething(); 
c2.OnSomething(); 

> This will be invoked twice. 
> This will be invoked twice. 

이러한 객체/이벤트 호출은 모두 별도의 하위 객체에서 가져온 경우에도 동일한 이벤트 핸들러를 호출합니다.

+0

명확한 점은 하위 클래스에서 OnSomething()을 구현 한 것은 무엇입니까? –

+0

@ 모아 라즈 아무도 없습니다. 자동적으로'Parent'를 상속받습니다. 'OnSomething();'을'Child' 내에서 호출 할 수 있습니다. 특별히 다른 동작으로 그것을 덮어 쓰지 않는 한, 기본적으로'Something' 이벤트를 호출 할 것입니다. – qJake

+0

아 물론 네, 물론 고마워요. –

0

someEventstatic을 지정하지 않으므로 첫 번째로하지 않는 것이 좋습니다. 자식 클래스의 모든 인스턴스에는 고유 한 someEvent이 있습니다. 즉, 통일 된 관점이 아니라 다양한 관점을 얻게됩니다. 배경을 클릭 할 때와 같은 방식으로 응답하고 싶지 않기 때문에 버튼을 눌렀을 때 응답하는 데 유용합니다.

일반적으로 클래스 계층 구조를 사용하는 대신 composition을 사용하여 이러한 상황을 처리 할 수 ​​있습니다. 예를 들어, 다음 클래스를 추가하십시오.

public class ParentContainer 
{ 
    private List<Parent> watched = new List<Parent>(); 
    public void Add(Parent watch) 
    { 
     watched.Add(watch); 
     watch.SomeEvent += Handler; 
    } 

    private void Handler(object sender, EventArgs args) 
    { 
     //Do something 
    } 
}