作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在下面的示例中,派生类的编写者将被期望调用 base.Add()。如果第一次发生,基地可以做一种代码。如果它最后发生,基地可以做另一种逻辑(见示例)。我似乎不可能同时拥有这两种方式。简单的解决方法就是完全停止调用基方法,因为基方法永远不会知道它是先被调用、最后被调用还是在中间被调用还是被调用两次!
处理这个问题的面向对象的方法是什么?我是否应该停止将代码放入基本方法,因为我永远不知道前置条件和后置条件?
编辑:目标是拥有一个执行 CRUD 操作的业务对象类。重复的代码将移至基类。例如,添加一条记录前检查业务对象的id是否为0,保存后检查业务对象的id是否>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
}
}
}
最佳答案
如果您想要一种安全的方式来引入前后条件检查,您可以使 Add 成为非虚拟的,而是使用派生类可以(或必须?)覆盖的另一种方法(AddInternal 或类似的方法):
namespace StackOverFlowSample
{
abstract class BusinessObjectBase
{
private bool _isNew;
private int _id;
protected abstract void AddInternal(string newAccount);
public void Add(string newAccount)
{
if(_isNew && _id>0) throw new InvalidOperationException("Invalid precondition state");
AddInternal(newAccount);
if (!_isNew && _id == 0) throw new InvalidOperationException("Invalid post condition state");
}
}
class BusinessObject : BusinessObjectBase {
protected override void AddInternal(string newAccount)
{
//Save newAccount to database
}
}
}
关于c# - 何时调用 base.method() 以及 base.method() 中应包含哪些代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1049318/
我是一名优秀的程序员,十分优秀!