Login
Пустой виртуальный метод вместо интерфейса
1779 просмотров
Перейти к просмотру всей ветки
in Antwort alex445 08.10.24 12:28, Zuletzt geändert 08.10.24 17:37 (Программист)
Иногда встречаю такую конструкцию, что в обычном, не абстрактном базовом классе есть пустой виртуальный метод, который явно нужен, чтобы его перегрузил потомковый класс.
Да, бывает.
А раз нужно, чтобы перегрузил, то зачем делать этот метод обычным?
Потому что не "нужно, чтобы перегрузил", а "нужно дать возможность перегрузить". Если бы было "нужно, чтобы перегрузил", то класс был бы абстратнным и метод тоже был бы абстрактным.
Сделать в виде интерфейса, и тогда получаешь гарантию, что его перегрузят.
Не получаешь :)
Если делать просто пустой метод, то его могут не перегрузить - ничего же не обязывает по синтаксису языка. Если же это такая задумка, что метод необязательно перегружать, то значит, что он не во всех потомках и нужен. Тогда смысл деражть такой метод в базовом классе? Проще каждому потомку свой метод иметь?
1) метод может быть частью интерфейса при этом имплементирующий этот интерфейс класс не является абстрактным.
2) метод может использоваться базовым классом
public interface IFoo { void Initialize (); void Start (); void Stop (); } public class DummyRunner : IFoo { public void Initialize () { 100500 различных инициализаций } public void Start () { сложный старт } public void Stop () { сложная остановка } protected virtual void TraceState () { } public override string ToString () { TraceState (); } } public class WorkerRunner : DummyRunner { protected override void TraceState () { base.TraceState (); // на случай, если база когда-нибудь захочет что-то записать в лог Пишем в лог 100500 параметров WorkerRunner'а } }