Я часто нахожу себя созданием классов, которые используют эту форму (A):
abstract class Animal {
public void Walk() {
// TODO: do something before walking
// custom logic implemented by each subclass
WalkInternal();
// TODO: do something after walking
}
protected abstract void WalkInternal();
}
class Dog : Animal {
protected override void WalkInternal() {
// TODO: walk with 4 legs
}
}
class Bird : Animal {
protected override void WalkInternal() {
// TODO: walk with 2 legs
}
}
Вместо этой формы (B):
abstract class Animal {
public abstract void Walk();
}
class Dog : Animal {
public override void Walk() {
// TODO: do something before walking
// custom logic implemented by each subclass
// TODO: walk with 4 legs
// TODO: do something after walking
}
}
class Bird : Animal {
public override void Walk() {
// TODO: do something before walking
// custom logic implemented by each subclass
// TODO: walk with 2 legs
// TODO: do something after walking
}
}
Как вы можете видеть, приятная вещь в форме A заключается в том, что каждый раз, когда вы реализуете подкласс, вам не нужно забывать включать логику инициализации и завершения. Это гораздо меньше подверженности ошибкам, чем форма B.
Какое стандартное соглашение для обозначения этих методов?
Мне нравится называть открытый метод Walk
, после чего я могу вызвать Dog.Walk()
, который выглядит лучше, чем что-то вроде Dog.WalkExternal()
. Однако мне не нравится мое решение добавить суффикс "Внутренний" для защищенного метода. Я ищу более стандартизованное имя.
Btw, есть ли название для этого шаблона проектирования?