C# 不允许公共虚拟委托无效

C# 不允许公共虚拟委托无效,c#,abstract-class,C#,Abstract Class,我想为越来越多的不同相机硬件创建一个通用基类,这样将来的项目就可以坚持一个通用的包装模式;更容易切换相机类型。于是我写道: NameSpace Wrapper { public class BaseCamera { public virtual event FrameArivedEventHandler FrameArived; //seams fine public virtual delegate void FrameArivedEventHandler(object se

我想为越来越多的不同相机硬件创建一个通用基类,这样将来的项目就可以坚持一个通用的包装模式;更容易切换相机类型。于是我写道:

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[]深度;其中是heat cam,可能包含一个double列表,并在帧数据中返回max heat)

我不知道为什么会出现这个错误,因为它在一些WIP代码(不是可执行文件)中出现。我没有收到这些警告(WIP代码在放入特定项目之前概述了类模型)

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

你得到了错误

 public virtual delegate void 
FrameArivedEventHandler(object sender, FrameArivedEventArgs e); //errors
因为您正在将委托标记为虚拟,并在事件中使用该委托类型

还有一件事,如果您正在创建抽象类,那么您的方法是
abstract
而不是virtual,现在您使用的是带有虚拟方法的普通类

代码中更大的问题是
公共虚拟委托
,您的委托是公共的,这意味着它是可修改的,这会给您带来问题。要了解更多信息,请查看此处:



在C#中,您不能使用虚拟类,这也是错误的。它应该是
抽象的

您希望这样做的方式有点走来走去。您是否尝试编写一些实际的示例,以供最终使用(例如,一些测试)

委托是一种类型,您不能重写它(甚至不能从它继承)

<>我认为你应该把事件看成是所有相机类型相同的东西,可以改变的是事件或处理事件。 我用泛型和简单实现做了一个小例子,请看一下这是否是您想要做的

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();
    }
}
公共抽象类BaseCamera,其中TEventArgs:EventArgs
{
公共委托void FrameArivedEventHandler(对象发送方,TEventArgs e);//错误
公共虚拟事件FrameArivedEventHandler FrameArivedEvent;//
受保护的无效触发器(TEventArgs eventArgs)
{
FrameArivedEvent(此,eventArgs);
}
}
公共抽象类FrameArivedEventArgs:EventArgs
{
公共int计数器;
公共字节[]RawRGB;
}
公共级NikonCamera:BaseCamera
{
公共重写事件FrameArivedEventHandler FrameArivedEvent
{
//压倒一切
add=>base.FrameArivedEvent+=value;
remove=>base.FrameArivedEvent-=值;
}
}
公共类NikonFrameArrivedEventArgs:FrameArivedEventArgs
{
公共字符串消息{get;set;}
}
公共类测试示例UsageClass
{
公共测试示例UsageClass()
{
var摄像机=新的NikonCamera();
camera.FrameArivedEvent+=MyTestClassFrameArrivedEventHandler;
}
私有void MyTestClassFrameArrivedEventHandler(对象发送方,NikonFrameArrivedEventArgs e)
{
抛出新的NotImplementedException();
}
}

delegate
关键字是一个类型声明。
FrameArivedEventHandler
是从
delegate
继承的一个类。类型不能是
virtual
.hm,因此类型保留类型它们不会被重写,但我希望在特定的摄影机类中创建虚拟方法并使用重写函数。@user3800527-否如果您有事件,那么在派生类中,您应该实现函数并附加该事件。没有使委托虚拟化的目的不可能重新定义事件吗?ea保持相同的名称,但重新生成不同的内容(byte[]RGB/而不是/int[]depth)@user3800527-不,事件允许我们绑定给定委托类型的函数,我还没有看到有人覆盖事件…你们都走错了路,你们最好更详细地了解事件/委托:)你们的权利,我有点不知所措,因为供应商特定的代码在处理相机数据的方式上存在巨大差异。我不打算重新定义事件类,相反,我将为它们的数据事件ea(YUV、RGB Flir、TOF、IR等)创建一个通用的基类。基类可以包含它们,并且由派生类来填充/触发它们支持的内容。好的,实际使用情况是,我在代码中使用一种通用方法来处理各种相机。工业摄像机的配置和设置通常非常复杂,这使得重用代码或快速更改现有项目的摄像机非常复杂。有些返回RGB,有些返回YUV或Ushort双倍等
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();
    }
}