我想到为不断增长的一组不同的相机硬件创建一个通用的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代码更加概述了类模型)。
现在我不知道是不是真的允许,或者可以做到但我在这里做错了什么?。
答案 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