Здравствуйте, Философ, Вы писали:
Ф>Наследование применяется там, где экземпляры типа-наследника являются экземплярами типа-предка (по крайней мере должно применяться). Более того, наиболее правильно наследование применять, если имеет место уточнение реализации.
Верно, и в этом случае уточняющие методы по сути превращаются в события.
Ф>1)
Ф>abstract class Base {protected void BaseMethod(){}; protected abstract void Do();}
Ф>abstract class A : Base { protected void MethodA() { BaseMethod() };}
Ф>class B : A { protected void MethodB() { MethodA() }; override void Do {MethodB();} }
trait Base { void BaseMethod(){}; void Do(); } // В данном случае Do вообще не нужен, т.к. речь о наследовании реализации, а не полиморфизме
trait A includes Base { void MethodA() { Base.BaseMethod() }; }
class B includes A { void MethodB() { A.MethodA() }; void Do { MethodB(); } }
Ф>2)
Ф>class Control {protected virtual void WndProc(); protected virtual void DefWndProc(); }
Ф>class ScrollableControl :Control {protected override void WndProc() { base.WndProc(); } }
Ф>class ContainerControl :ScrollableControl {protected override void WndProc() { base.WndProc(); } }
Ф>class Form :ContainerControl {protected override void WndProc() { base.WndProc(); } }
Ф>class MyForm :Form {protected override void WndProc() { base.WndProc(); DefWndProc()} }
class Control { void WndProc(); void DefWndProc(); }
class ScrollableControl { void WndProc() { control.WndProc(); } }
class ContainerControl { void WndProc() { scrollableControl.WndProc(); } }
class Form { void WndProc() { containerControl.WndProc(); } }
class MyForm { void WndProc() { form.WndProc(); control.DefWndProc(); } }
Получилось даже как-то... ПРОЩЕ???
Ф>Ровно настолько же, насколько не нужно и ООП — без него вполне можно жить.
Ф>Однако в ряде случаев оно может упростить жизнь.
А в ряде других случаев может усложнить. Вопрос — каких рядов больше.
Здравствуйте, Tom, Вы писали:
Ф>>не вижу никакой проблемы.
Tom>Вы тесты пишете?
Я пишу. И тоже не вижу проблемы.
Потому что я тестирую "снизу вверх", и моки мне в принципе не нужны. Ну, кроме как для подмены внешней среды типа CurrentTime, но таких с гулькин хвост (тут было бы более актуально спросить "а нужны ли нам интерфейсы?" и ответить: "ну вот для парочки таких вот случаев, пожалуй, пригодятся"
).