Как скрыть метод базового класса?

181
19 февраля 2019, 17:20

У меня есть класс WsEvent:

internal class WsEvent
{
    public string Name { get; private set; }
    public void Invoke() {}
}

И есть его обобщенный наследник:

internal class WsEvent<T> : WsEvent
{
    public T EventData { get; private set; }
    public void Invoke(T Data) {}
}

Я хотел бы скрыть метод Invoke() базового класса при использовании обобщенного класса. Сейчас IntelliSens подсказывает, что у экземпляра обобщенного класса есть перегруженный метод Invoke() и Invoke(T). Я хочу что бы был только Invoke(T).

Может быть подход целиком не правильный. Я в попытках методом тыка изучить обобщенные классы)

Answer 1

Выделите интерфейс:

interface IWsEvent
{
    string Name { get; }
    void Invoke();
}
interface IWsEvent<T> : IWsEvent
{
    T EventData { get; }
    void Invoke(T Data);
}

И реализуйте нужный метод явно:

class WsEvent : IWsEvent
{
    public string Name { get; private set; }
    public void Invoke() { }
}
class WsEvent<T> : IWsEvent<T>
{
    public string Name { get; private set; }
    void IWsEvent.Invoke() { } // <== явная реализация
    public T EventData { get; private set; }
    public void Invoke(T Data) { }
}
Answer 2

Скрыть базовые методы невозможно. Но можно не наследоваться от не-обобщенного типа ИЛИ можно ввести вместо этого 2 интерфейса - обобщенный и не-обобщенный. Старые типы при этом реализуют не-обобщенный интерфейс, новые - обобщенный. И интерфейсы уже наследуйте как хотите.

Например, MS для IEnumerable<T> выбрали наследование от IEnumerable. Но, так как вы хотите иное, то вы не должны так наследовать, и для вас обобщенный и не-обобщенный интерфейсы будут не связаны друг с другом.

READ ALSO
Как рисовать в WPF без сглаживания?

Как рисовать в WPF без сглаживания?

Возникла необходимость нарисовать поверхность на основе примитивов (лаба по компьютерной графике)Поверхность рисуется в собственном контроле...

163
Покадровая анимация png

Покадровая анимация png

Есть ~100 файлов png нужно их как бы анимировать, весят они от 8кб до 4мб

164
Visual Studio Installer DotNetFX461

Visual Studio Installer DotNetFX461

Пытаюсь к инталлятору положить DotNetFX461Если не выполнять ни каких действий, то при сборке проекта ругается:

174
YII2 SMTP email Expected response code 354 but got code &ldquo;554&rdquo;

YII2 SMTP email Expected response code 354 but got code “554”

Друзья помогите побороть ошибку при отправке email , обычная форма обратной связи

354