2012-02-23 21 views
0

我剛接觸使用繼承類,所以我可能會錯過一些完全明顯的東西。我有兩個類,A和B,都繼承了一些其他類Z.類Z有很多方法等在繼承類方法完成之後引發事件

我想弄清楚是如何創建一個事件(或只是一些方法)在A類和B類觸發 Z類中的某些方法完成...

有沒有辦法做到這一點?

乾杯

回答

2

使用抽象方法:

子類覆蓋從基類抽象方法。

abstract class Z { 
    abstract doSomethingElse(); 

    doSomething(){ 
     //main logic 

     doSomethingElse(); 
    } 
} 

class A : Z { 
    doSomethingElse(){ 
     //subclass logic 
    } 
} 

class B : Z { 
    doSomethingElse(){ 
     //subclass logic 
    } 
} 

按照慣例調用基礎:從基類&調用基方法

覆蓋虛擬方法在開始

class Z { 
    doSomething(){ 
     //main logic 
    } 
} 

class A : Z { 
    doSomething(){ 
     base.doSomething() 

     //subclass logic 
    } 
} 

class B : Z { 
    doSomething(){ 
     base.doSomething() 

     //subclass logic 
    } 
} 

代表注射:

在超類的構造函數中需要一個委託。調用委託。

class Z { 
    delegate somethingDone 

    Z(_somethingDone){ 
     somethingDone = _somethingDone 
    } 

    doSomething(){ 
     //main logic 

     somethingDone() 
    } 
} 

class A : Z { 
    A() : base(onSomethingDone){ 

    } 

    onSomethingDone(){ 
     //subclass logic 
    } 
} 

class B : Z { 
    B() : base(onSomethingDone){ 

    } 

    onSomethingDone(){ 
     //subclass logic 
    } 
} 

事件訂閱:

火災時的動作發生的事件。其他類訂閱事件

class Z { 
    doSomething(){ 
     //main logic 

     fireEvent("SomethingDone") 
    } 
} 

class A { 
    A(){ 
     subscribeToEvent("SomethingDone", onSomethingDone) 
    } 

    onSomethingDone(){ 
     //subclass logic 
    } 
} 

class B { 
    B(){ 
     subscribeToEvent("SomethingDone", onSomethingDone) 
    } 

    onSomethingDone(){ 
     //subclass logic 
    } 
} 
+0

+1顯而易見的努力。 – x0n 2012-02-23 01:41:26

+0

謝謝你! – keynesiancross 2012-02-24 00:29:16

2

你可以有Z類受保護的虛擬方法和類A和B實現它:

class Z 
{ 
protected virtual AfterMethodCalled(){} 

public void Method() 
{ 
//do its job 
AfterMethodCalled(); 
} 
} 

classA:Z 
{ 
protected override AfterMethodCalled() 
{ 
//do its job 
} 
} 

編輯 如果你想提高和事件後,出事了在你的代碼中,同時讓派生類改變事件行爲,你可以這樣做:

class Z 
    { 
    public event EventHandler AfterMethodCalled;//defines a delegate to be used as an event. 

    protected virtual OnAfterMethodCalled 
    { 
    if(AfterMethodCalled!=null) //if there's at least one subscriber to this event 
    AfterMethodCalled(this,EventArgs.Empty); //raise the event 
    } 

    public void Method() 
    { 
    //do the job 
    OnAfterMethodCalled(); 
    } 

then each sub class can either subscribe to this event and even change the base behavior by overriding this virtual method: 

class A: 
{ 

protected override OnAfterMethodCalled() 
{ 
//do the job; 
base.OnAfterMethodCalled(); // you can omit this line if you want to prevent raising the event 
} 
} 
    } 
1

在我看來,你想要的是一個事件,看看http://msdn.microsoft.com/en-us/library/awbftdfh.aspx有關事件的更多信息,但像他這樣一個簡單的事件實現應該做的伎倆

基Z類

public event Action MyEvent; 

public void MyMethod() 
{ 
    // a lot of work... 

    SomethingHappened(); 
} 

protected virtual void SomethingHappened() 
{ 
    Action currentEvent = MyEvent; 

    if (currentEvent != null) 
    { 
     currentEvent(); 
    } 
} 

繼承類(A或B)

public A() 
{ 
    MyEvent += DoAdditionalWork; 
} 

public void DoAdditionalWork() 
{ 

} 

訣竅是發佈一個事件,並在完成方法時引發它,然後任何消費者都可以訂閱它,並在方法執行完成後執行它的工作。