级联多个继承和事件
本文关键字:事件 继承 级联 | 更新日期: 2023-09-27 18:31:44
我真的不确定谷歌还有什么可以尝试找到答案,谁能告诉我实现这些事件的正确方法?在 ClassOne 中,该事件被认为是空的,我只是不明白....
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace MultipleInheritance
{
static class Program
{
static void Main()
{
ClassThree cThree = new ClassThree();
cThree.fireEventOne += cThree_fireEventOne;
cThree.Start();
cThree.Start2();
cThree.Start3();
}
static void cThree_fireEventOne()
{
Console.WriteLine("one two three");
}
}
}
这是类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace MultipleInheritance
{
public abstract class ClassOne
{
public delegate void EventOne();
public event EventOne fireEventOne;
public ClassOne()
{
}
public void Start()
{
fireEventOne();
}
public abstract void Start2();
}
public abstract class ClassTwo :ClassOne
{
public delegate void EventOne();
public event EventOne fireEventOne;
public override void Start2()
{
fireEventOne();
}
public abstract void Start3();
}
public class ClassThree :ClassTwo
{
public delegate void EventOne();
public event EventOne fireEventOne;
public override void Start3()
{
fireEventOne();
}
}
}
问题是你在每个类中重新定义了以下内容:
public delegate void EventOne();
public event EventOne fireEventOne;
因此,当您调用Start()
时,您正在尝试在类ClassOne
中触发事件fireEventOne
,但您已经ClassThree
挂接了阴影事件,如下所示:
cThree.fireEventOne += cThree_fireEventOne;
我明白你为什么这样编码。尝试直接从父类调用事件时出现编译器错误。正确的方法是提供一个protected
方法,在父类中调用该方法以触发事件。
尝试像这样编写类:
public abstract class ClassOne
{
public delegate void EventOne();
public event EventOne fireEventOne;
public ClassOne()
{ }
public void Start()
{
this.DoFireEventOne();
}
protected void DoFireEventOne()
{
var feo = fireEventOne;
if (feo != null)
{
feo();
}
}
public abstract void Start2();
}
public abstract class ClassTwo :ClassOne
{
public override void Start2()
{
this.DoFireEventOne();
}
public abstract void Start3();
}
public class ClassThree :ClassTwo
{
public override void Start3()
{
this.DoFireEventOne();
}
}
在每个类中创建 fireEventOne 事件。所以,你有三个事件。但是,fireEventOne 方法是在第一级(ClassOne)上实现的。因此,它将提高 ClassOne 类的委托。删除后代类的 fireEventOne 事件。