1、 在建立基類時,若涉及到事件,事件是特殊型別的委託,只可以從宣告它們的類中呼叫,派生類無法直接呼叫基類中宣告的事件,但是在多數情況,會需要允許派生類呼叫基類事件,這時,可以再包含該事件的基類中建立乙個受保護的虛呼叫方法,通過呼叫或重寫此呼叫方法,派生類便可以間接呼叫該事件。
注:不要在基類中宣告虛擬事件,也不要在派生類中重寫這些事件,c#編譯器無法正確處理這些事件,並且無法預知該派生的事件的使用者是否真正訂閱了基類事件。
和下面的程式示例都來自:
2、 插入知識點:virtual和abstract的區別:
virtual和abstract都是用來修飾父類的,通過覆蓋父類的定義,讓子類重新定義(子類方法前都必須新增override),因此虛擬方法和抽象方法都不能是私有的;
virtual修飾的方法必須有實現(哪怕是僅僅新增一對大括號),而abstract修飾的方法一定不能實現;
virtual可以被子類重寫,而abstract必須被子類重寫;
如果類成員被abstract修飾,則該類前必須新增abstract,因為只有抽象類才可以有抽象方法;
無法建立abstract類的例項;
3、示例程式
1namespace
test0301220
}2122public
class
shapeeventargs : eventargs
2330
31public
double
newarea
3234}35
}3637public
abstract
class
shape
3844
set 45}
4647
public
event eventhandlershapechanged;
4849
public
abstract
void draw();//
abstract和類定義的abstract對應,在派生類中必須實現
5051
//基類可以過載此函式,實現實際物件型別的此函式
52//
此函式為事件控制代碼的實現函式
53protected
virtual
void
onshapechanged(shapeeventargs e)
54呼叫
", this
.tostring());
5657 eventhandlerhandler =shapechanged;
58if (handler != null)59
62}63}
6465
public
class
circle : shape
6674
75public
void update(double
d)76
8182
protected
override
void
onshapechanged(shapeeventargs e)
8390
91public
override
void
draw()
9296}97
98public
class
rectangle : shape
99109
110public
void update(double length, double
width)
111117
118protected
override
void
onshapechanged(shapeeventargs e)
119123
124public
override
void
draw()
125129
}130
131public
class
shapecontainer
132139
140public
void
addshape(shape s)
141146
147private
void handleshapechanged(object
sender, shapeeventargs e)
148"
, e.newarea);
152153
s.draw();
154}
155}
156 }
在派生類中引發基類事件
1 事件是特殊的委託,所以只可以在宣告它的類中呼叫。在基類中宣告乙個事件,所以可以在基類中呼叫,而不能在派生類中直接呼叫。但有些情況下,需要在派生類中引用基類事件,實現方法是,在基類中定義乙個受保護的方法引用事件,然後在派生類中重寫基類方法,利用base關鍵字實現間接呼叫基類事件。2 派生類呼叫基類...
C 如何在派生類中引發基類事件
下面的簡單示例演示用於在基類中宣告事件,以便也可以從派生類引發它們的標準方法。此模式廣泛用於 net 類庫中的 windows 窗體類。建立可以用作其他類的基類的類時,應考慮到以下事實 事件是特殊型別的委託,只能從宣告它們的類中進行呼叫。派生類不能直接呼叫在基類中宣告的事件。雖然有時可能需要只能由基...
如何 在派生類中引發基類事件(C 程式設計指南
visual studio 2013 其他版本 以下簡單示例演示了在基類中宣告可從派生類引發的事件的標準方法。此模式廣泛應用於 net framework 類庫中的 windows 窗體類。在建立可用作其他類的基類的類時,應考慮如下事實 事件是特殊型別的委託,只可以從宣告它們的類中呼叫。派生類無法直...