Переопределить явно реализованный метод интерфейса в производном классе - PullRequest
5 голосов
/ 23 июня 2010

Я хочу явно реализовать метод интерфейса в базовом классе.

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

Я попытался создать защищенный виртуальный метод в базе, вызвав его из метода интерфейса и затем переопределив этот метод в производном классе.Кажется, это работает, но FxCop жалуется на правило CA1033 «Методы интерфейса должны вызываться дочерними типами».

(Мой базовый класс реализует интерфейс, производный класс - нет.)

Какя должен улучшить этот (сокращенный) код, чтобы он был более правильным, или я должен просто игнорировать FxCop в этом случае?

В базовом классе:

protected virtual string ConstructSignal()
{
    return "Base string";
}

#region ISignal Members

string ISignal.GetMessage()
{
    this.ConstructSignal();
}

#endregion

В производном классе:

protected override string ConstructSignal()
{
    return "Derived string";
}

В конце концов решил неявно реализовать методы интерфейса, что по-прежнему работает и поддерживает FxCop.

1 Ответ

2 голосов
/ 09 сентября 2011

Переместите объявление метода ConstructSignal () в некоторый интерфейс (назовите его IConstructSignal) и внедрите его в производный класс.Следующая явная реализация будет работать:

string ISignal.GetMessage()
{
    (this as IConstructSignal).ConstructSignal(); // implementation of derived class called
}
...