C# 级联多重继承和事件
我真的不知道谷歌还能做些什么来找到答案,有谁能告诉我实施这些事件的正确方法吗?在ClassOne中,事件被认为是空的,我就是不明白C# 级联多重继承和事件,c#,.net,C#,.net,我真的不知道谷歌还能做些什么来找到答案,有谁能告诉我实施这些事件的正确方法吗?在ClassOne中,事件被认为是空的,我就是不明白 using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; namespace MultipleInheritance { static class Program
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;
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();
}
}
我明白你为什么那样编码了。试图从父类直接调用事件时,会出现编译器错误。正确的方法是提供一个protected
方法,您可以在父类中调用该方法来触发事件
试着这样编写您的类:
cThree.fireEventOne += cThree_fireEventOne;
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();
}
}
问题是您在每个类中重新定义了以下内容:
public delegate void EventOne();
public event EventOne fireEventOne;
因此,当您调用Start()
时,您正试图在类ClassOne
中触发事件fireEventOne
,但您已将ClassThree
中的阴影事件如下所示:
cThree.fireEventOne += cThree_fireEventOne;
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();
}
}
我明白你为什么那样编码了。试图从父类直接调用事件时,会出现编译器错误。正确的方法是提供一个protected
方法,您可以在父类中调用该方法来触发事件
试着这样编写您的类:
cThree.fireEventOne += cThree_fireEventOne;
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事件。在每个类中创建fireEventOne事件。那么,你有三件事。但是,fireEventOne方法是在第一级(ClassOne)上实现的。因此,它将提升ClassOne类的委托。删除子类的fireEventOne事件。还请注意,C#实际上没有多重继承,即一个类从同一级别的多个类继承,类似于
子类:父类、母类
。您所做的只是标准继承。它只是“多重”的意思,即你有多个后代,但称之为“多重”并不是严格正确的。还要注意的是,C#实际上没有多重继承,即一个类从同一级别的多个类继承,类似于孩子:母亲,父亲
。您所做的只是标准继承。在你有多个后代的意义上,这只是“多重的”,但称之为“多重”并不完全正确。摇滚乐,谢谢!摇滚乐,谢谢!