Предполагая, что вы начинаете с этими двумя классами:Является ли это шаблоном проектирования программного обеспечения?
public class Foo{
public virtual Baz Bar(){
return GetStandardBaz();
}
}
public class Qux: Foo{
public virtual Baz Bar(){
return GetQuxBaz();
}
}
Теперь давайте говорить требование придумывает что-то делать с Baz
перед его возвращением, когда Bar
вызывается. Я хотел бы создать метод virtual protected
и удалить virtual
из открытого метода следующим образом:
public class Foo{
public Baz Bar(){
var value = BarInternal();
DoSomethingFirst(value);
return value;
}
protected virtual Baz BarInternal(){
return GetStandardBaz();
}
}
public class Qux: Foo{
protected override Baz BarInternal(){
return GetQuxBaz();
}
}
Это гарантирует, что всякий раз, когда Bar
прибудет называеться, полученный Baz
передается в DoSomethingFirst
перед возвращением. Да, это измененное изменение для всех дочерних классов, но оно не требует каких-либо обновлений для любых сайтов вызовов Bar
.
Это стандартный шаблон дизайна? Есть ли лучший способ, который мне не хватает? Также интересно узнать, есть ли лучшее исправление после исправления, чем Internal
.
Есть ли причина не добавлять метод базового класса Baz2 (или NewBaz, или что-то еще)? Таким образом, вы избегаете ломающихся изменений. Для соглашения об именах «Внутренний» не является ужасным. «Impl» также распространен. – ThatBlairGuy
Вы имеете в виду 'override' в' Qux'? – dtb
Отвечая на мой собственный вопрос - требование не затрагивать места, вызывающие Baz(), недействительно. Методы в производных классах, которые вызывают Baz(), должны быть изменены, и в зависимости от обстоятельств (например, кто-то другой, использующий вашу библиотеку) у вас может не быть доступа к этому коду. Добавление нового метода с новым поведением - лучшая практика. – ThatBlairGuy