открытый виртуальный делегат недействителен - PullRequest
0 голосов
/ 08 июня 2018

Ну, я подумал о создании общего базового класса для растущей группы различного аппаратного обеспечения, чтобы будущие проекты могли придерживаться общего шаблона оболочки;и более легко переключать типы камер.Поэтому я написал:

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;
    }

Но я получил предупреждение «Виртуальный модификатор недопустим для этого элемента», в строке делегата void идея заключалась в том, что для каждого класса камеры я хотел бы использоватьэтот базовый класс и перезаписать определенные методы (например, камера глубины содержит общедоступную usort [] глубину; где тепловая камера может содержать список двойных и возвращать также максимальный нагрев в данных кадра.

Не уверенпочему я получаю сообщение об ошибке, потому что оно заклинивает в некотором коде WIP (а не в исполняемом файле). Я не получаю это предупреждение (код WIP скорее обрисовал в общих чертах модель класса перед помещением в конкретный проект).

Теперь мне интересноРазве это действительно разрешено, или это можно сделать, но я здесь что-то не так делаю?

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

То, как вы хотите это сделать, - немного ходить.Вы пытались написать какой-нибудь реальный пример того, как он будет использоваться в конце (например, какой-нибудь тест)?

Делегат - это тип, и вы не можете переопределить его (или даже наследовать от него).

Я думаю, что вы должны рассматривать событие как нечто одинаковое для всех типов камер, что может измениться, это 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();
    }
}
0 голосов
/ 08 июня 2018

вы получаете ошибку

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

, потому что вы помечаете делегата как виртуального и используете этот тип делегата в вашем событии.

еще одна вещь, если вы создаете абстрактный класс, тогда ваши методы abstract не виртуальные, сейчас у вас нормальный класс с виртуальными методами.

И большая проблема с вашим кодом - public virtual delegate, ваш делегат является общедоступным, что означает его изменяемость и вызывает проблему для вас.Чтобы понять это, проверьте здесь: Event Vs Deleagte


public virtual class FrameArivedEventArgs : EventArgs 

В C # у вас не может быть виртуального класса, что также неправильно.это должно быть abstract

...