Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 级联多重继承和事件_C#_.net - Fatal编程技术网

C# 级联多重继承和事件

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

我真的不知道谷歌还能做些什么来找到答案,有谁能告诉我实施这些事件的正确方法吗?在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;
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#实际上没有多重继承,即一个类从同一级别的多个类继承,类似于
孩子:母亲,父亲
。您所做的只是标准继承。在你有多个后代的意义上,这只是“多重的”,但称之为“多重”并不完全正确。摇滚乐,谢谢!摇滚乐,谢谢!