public virtual delegate void不允许

时间:2018-06-08 13:01:49

标签: c# abstract-class

我想到为不断增长的一组不同的相机硬件创建一个通用的Base类,以便将来的项目可以坚持一个共同的包装模式;并且更容易切换相机类型。所以我写道:

NameSpace Wrapper
{ 
public class BaseCamera
{
    public virtual event FrameArivedEventHandler FrameArived; //seams fine
    public virtual delegate void FrameArivedEventHandler(object sender, FrameArivedEventArgs e); //errors
    public virtual class FrameArivedEventArgs : EventArgs   //event class variabelen.
    {
        public int counter;
        public byte[] RawRGB;
    }

但是我收到了警告"修改器虚拟对此项目无效", 在委托空行,我的想法是,对于每个摄像机类,我想使用这个基类并覆盖特定的方法(例如深度摄像机包含公共的usort []深度;热点凸轮可能包含列表在哪里双倍并返回帧数据中的最大热量。

不确定为什么我会收到错误导致它在某些WIP代码(而不是可执行文件)中出现问题我没有收到这些警告(在进入特定项目之前,WIP代码更加概述了类模型)。

现在我不知道是不是真的允许,或者可以做到但我在这里做错了什么?。

2 个答案:

答案 0 :(得分:1)

你想要这样做的方式有点走动。您是否尝试编写一些现实生活中的例子,最终会用到它(例如某些测试)?

Delegate是一种类型,你不能覆盖它(甚至不能从它继承)。

我认为您应该将事件视为所有相机类型的相同事件,可以更改的事件是EventArgs或处理事件。

我已经用泛型和简单的实现做了一个小例子,请看看这是否是你想要做的。

public abstract class BaseCamera<TEventArgs> where TEventArgs : EventArgs
{
    public delegate void FrameArivedEventHandler(object sender, TEventArgs e); //errors

    public virtual event FrameArivedEventHandler FrameArivedEvent; //seams fine

    protected void Trigger(TEventArgs eventArgs)
    {
        FrameArivedEvent(this, eventArgs);
    }
}

public abstract class FrameArivedEventArgs : EventArgs
{
    public int counter;
    public byte[] RawRGB;
}

public class NikonCamera : BaseCamera<NikonFrameArrivedEventArgs>
{
    public override event FrameArivedEventHandler FrameArivedEvent
    {
        // Override whatever
        add => base.FrameArivedEvent += value;
        remove => base.FrameArivedEvent -= value;
    }
}

public class NikonFrameArrivedEventArgs : FrameArivedEventArgs
{
    public string Message { get; set; }
}

public class TestExampleUsageClass
{

    public TestExampleUsageClass()
    {
        var camera = new NikonCamera();
        camera.FrameArivedEvent += MyTestClassFrameArrivedEventHandler;
    }

    private void MyTestClassFrameArrivedEventHandler(object sender, NikonFrameArrivedEventArgs e)
    {
        throw new NotImplementedException();
    }
}

答案 1 :(得分:0)

您收到错误

 public virtual delegate void 
FrameArivedEventHandler(object sender, FrameArivedEventArgs e); //errors

因为您将委托标记为虚拟,并在事件上使用该委托类型。

如果你正在创建抽象类,那么另外一件事就是你的方法abstract不是虚拟的,现在你正在使用虚拟方法进行普通的类。

代码的更大问题是public virtual delegate,您委托是公开的,这意味着它可以修改并导致问题。要了解这一点,请查看此处:Event Vs Deleagte

public virtual class FrameArivedEventArgs : EventArgs 

在C#中你不能拥有虚拟课程,这也是错误的。它应该是abstract