В следующем примере автор производного класса должен вызвать base.Add (). Если это произойдет 1-го, база может сделать один вид кода. Если это произойдет в последний раз, база может сделать другую логику (см. Пример). Я не вижу возможности иметь оба пути. И простым решением было бы вообще перестать вызывать базовый метод, потому что база никогда не узнает, вызывается ли он первым, последним или посередине или дважды!
Что такое объектно-ориентированный способ борьбы с этим? Должен ли я просто прекратить помещать код в базовые методы, потому что я никогда не узнаю предварительные и постусловия?
РЕДАКТИРОВАТЬ: цель состоит в том, чтобы иметь класс бизнес-объектов, который выполняет операции CRUD. Повторяющийся код будет перемещен в базовый класс. Например, проверяя, видит ли перед добавлением записи идентификатор бизнес-объекта 0, и проверяя, что после сохранения идентификатор бизнес-объекта> 0.
namespace StackOverFlowSample
{
class BusinessObjectBase
{
private bool _isNew;
private int _id;
public virtual void Add(string newAccount)
{
//Code that happens when subclasses run this method with the
//same signature
//makes sense if base is called 1st
if(_isNew && _id>0) throw new InvalidOperationException("Invalid precondition state");
//makes sense if bae is called 2nd
if (!_isNew && _id == 0) throw new InvalidOperationException("Invalid post condition state");
}
}
class BusinessObject : BusinessObjectBase {
public override void Add(string newAccount)
{
//doesn't make sense, because base will need to be called again.
base.Add(newAccount);//pre validation, logging
//Save newAccount to database
//doesn't make sense, because base has already been called
base.Add(newAccount); //post validation, logging
}
}
}