[英]Cascading Multiple Inheritance and Events
我真的不确定要用什么Google来找到答案,有人可以告诉我实施这些事件的正确方法吗? 在ClassOne中,该事件被视为null,而我只是不知道该事件。
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
类中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事件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.