级联多个继承和事件

本文关键字:事件 继承 级联 | 更新日期: 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 事件。