我剛接觸使用繼承類,所以我可能會錯過一些完全明顯的東西。我有兩個類,A和B,都繼承了一些其他類Z.類Z有很多方法等在繼承類方法完成之後引發事件
我想弄清楚是如何創建一個事件(或只是一些方法)在A類和B類觸發後 Z類中的某些方法完成...
有沒有辦法做到這一點?
乾杯
我剛接觸使用繼承類,所以我可能會錯過一些完全明顯的東西。我有兩個類,A和B,都繼承了一些其他類Z.類Z有很多方法等在繼承類方法完成之後引發事件
我想弄清楚是如何創建一個事件(或只是一些方法)在A類和B類觸發後 Z類中的某些方法完成...
有沒有辦法做到這一點?
乾杯
使用抽象方法:
子類覆蓋從基類抽象方法。
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
}
}
你可以有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
}
}
}
在我看來,你想要的是一個事件,看看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()
{
}
訣竅是發佈一個事件,並在完成方法時引發它,然後任何消費者都可以訂閱它,並在方法執行完成後執行它的工作。
+1顯而易見的努力。 – x0n 2012-02-23 01:41:26
謝謝你! – keynesiancross 2012-02-24 00:29:16