繁体   English   中英

级联多个继承和事件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM