在派生類中引發基類事件

2021-09-26 19:38:54 字數 3224 閱讀 5610

(1)事件是特殊的委託,所以只可以在宣告它的類中呼叫。在基類中宣告乙個事件,所以可以在基類中呼叫,而不能在派生類中直接呼叫。但有些情況下,需要在派生類中引用基類事件,實現方法是,在基類中定義乙個受保護的方法引用事件,然後在派生類中重寫基類方法,利用base關鍵字實現間接呼叫基類事件。

(2)派生類呼叫基類事件。

class

derivedclassevent

", c.area);

shape shape =c;

shape.shapechanged +=handleshapechanged;

c.update(

100);

console.read();

}private

static

void handleshapechanged(object

sender,shapeeventargs e)

", e.newarea);

s.draw();}}

public

class

shapeeventargs : eventargs

}public shapeeventargs(double

s)

}//////

定義乙個圖形抽象類

///在該抽象類中宣告乙個事件

///並定義在圖形發生改變時,觸發乙個事件

/// public

abstract

class

shape

set

}public

event eventhandlershapechanged;

public

abstract

void

draw();

protected

virtual

void

onshapechanged(shapeeventargs e)}}

//////

定義乙個關於圓的類繼承圖形抽象類

/// public

class

circle : shape

public

void update(double

d)

//////

重寫基類方法,然後用base關鍵字呼叫基類方法

///間接實現在子類中呼叫事件

(3)msdn原例

namespace

baseclassevents

public

double

newarea}}

//base class event publisher

public

abstract

class

shape

set

}//the event. note that by using the generic eventhandlerevent type

//we do not need to declare a separate delegate type.

public

event eventhandlershapechanged;

public

abstract

void

draw();

//the event-invoking method that derived classes can override.

protected

virtual

void

onshapechanged(shapeeventargs e)}}

public

class

circle : shape

public

void update(double

d)

protected

override

void

onshapechanged(shapeeventargs e)

public

override

void

draw()

}public

class

rectangle : shape

public

void update(double length, double

width)

protected

override

void

onshapechanged(shapeeventargs e)

public

override

void

draw()

}//represents the su***ce on which the shapes are drawn

//subscribes to shape events so that it knows

//when to redraw a shape.

public

class

shapecontainer

public

void

addshape(shape s)

//...other methods to draw, resize, etc.

private

void handleshapechanged(object

sender, shapeeventargs e)

", e.newarea);

//redraw the shape here.

s.draw();}}

class

test

}}/*

output:

received event. shape area is now 10201.86

drawing a circle

received event. shape area is now 49

drawing a rectangle

*/

在派生類中引發基類事件

1 在建立基類時,若涉及到事件,事件是特殊型別的委託,只可以從宣告它們的類中呼叫,派生類無法直接呼叫基類中宣告的事件,但是在多數情況,會需要允許派生類呼叫基類事件,這時,可以再包含該事件的基類中建立乙個受保護的虛呼叫方法,通過呼叫或重寫此呼叫方法,派生類便可以間接呼叫該事件。注 不要在基類中宣告虛擬...

C 如何在派生類中引發基類事件

下面的簡單示例演示用於在基類中宣告事件,以便也可以從派生類引發它們的標準方法。此模式廣泛用於 net 類庫中的 windows 窗體類。建立可以用作其他類的基類的類時,應考慮到以下事實 事件是特殊型別的委託,只能從宣告它們的類中進行呼叫。派生類不能直接呼叫在基類中宣告的事件。雖然有時可能需要只能由基...

如何 在派生類中引發基類事件(C 程式設計指南

visual studio 2013 其他版本 以下簡單示例演示了在基類中宣告可從派生類引發的事件的標準方法。此模式廣泛應用於 net framework 類庫中的 windows 窗體類。在建立可用作其他類的基類的類時,應考慮如下事實 事件是特殊型別的委託,只可以從宣告它們的類中呼叫。派生類無法直...