event 的继承问题

dyhml 2006-10-19 01:57:28
event 的继承问题

abstract class DataProvider {
public delegate void DataHandler(DataProvider src,byte[] data);
public event DataHandler processData;
}

class ChildDataProvider : DataProvider {
private void run(){
while(true){
.....
byte[] data=....
processData(this, data);
}
}
}


出错,processData 只能在 DataProvider 中调用,不能在子类中调用,
可以去掉 processData 的 event ,但这里我希望还是用 event 。

想要实现的是

//用工厂方法返回子类
DataProvider pro=DataProviderFactory(ChildDataProvider);

pro.processData+=new delegate .........

event 的 processData 用于限制它只能在 DataProvider 及其子类中调用,外面只能注册,取消注册。

...全文
342 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovvver 2006-10-20
  • 打赏
  • 举报
回复
问题搞清楚了,就已经可以揭贴啦
dyhml 2006-10-20
  • 打赏
  • 举报
回复
顶一下,再讨论讨论就结贴。
股神 2006-10-19
  • 打赏
  • 举报
回复
up.......
dyhml 2006-10-19
  • 打赏
  • 举报
回复
谢谢大家,特别是 jetxia(Thinking&Asking&Studying) ,你的方法正合我意。

还有问题
//用工厂方法返回子类
DataProvider pro=DataProviderFactory(ChildDataProvider);
//注册事件处理函数
pro.processData+=new delegate .........
//实际的事件是在子类中处理的,所以我在子类中直接调用了 event,这是不行的,我也可以取消 event 直接用 delegate ,但这个类的继承树以外就可以调用 delegate 了,不太好。


下午我还想了另一种方案

abstract class DataProvider {
public delegate void DataHandler(DataProvider src,byte[] data);
//虚的事件,没有实现
abstract public event DataHandler processData;
}

class ChildDataProvider : DataProvider {
//实际在这里实现
public override event DataHandler processData;
private void run(){
while(true){
.....
byte[] data=....
//这里的调用是合法的
processData(this, data);
}
}
}

看起来似乎可以,但后来,我想到如果 ChildDataProvider 还有子类 GrandChild ,又不能直接调用 event 了,

如果再次 override event ,
class GrandChild : ChildDataProvider {
//再次 override
public override event DataHandler processData;
private run(){
//发出事件,调用 processData 处理
processData(....);//用的是 GrandChild.processData;
}
}

实际类型为 GrandChild 而用Child的类型调用注册子类的事件处理函数时,会注册到Child 的 event 里,不能在GrandChild调用.
ChildDataProvider a=new GrandChild();
a.processData+=......// 应该是注册了 Child.processData 而不是 GrandChild.processData

实际类型为 GrandChild ,用 DataProvider 的类型调用,会如何?注册到哪个event ? Child.processData 还是 GrandChild.processData ?
DataProvider a=new GrandChild();
a.processData+=......
jetxia 2006-10-19
  • 打赏
  • 举报
回复
abstract class DataProvider {
public delegate void DataHandler(DataProvider src,byte[] data);
public event DataHandler processData;
protectd virtual void OnProcessData(byte[] data)
{
if(processData != null)
{
processData(this, data)
}
}
}

class ChildDataProvider : DataProvider {
private void run(){
while(true){
.....
byte[] data=....
OnProcessData(this, data);
}
}
}
jetxia 2006-10-19
  • 打赏
  • 举报
回复
事件(与字段不同)只能从声明它们的类中调用,派生类不能直接调用基类中声明的事件
idda 2006-10-19
  • 打赏
  • 举报
回复
byte[] data=....
processData(this, data);
这样写是不对的, processData是event,不能当方法来使用.
如果你一定要这么写的话, 可以声名delegate实例,用它代替processData, 或者
processData +=new DataHandler(ChildDataProvider_processData);
private void ChildDataProvider_processData(DataProvider src, byte[] data) {
...
}

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧