gpt4 book ai didi

c# - 何时调用 base.method() 以及 base.method() 中应包含哪些代码?

转载 作者:行者123 更新时间:2023-11-30 14:44:02 24 4
gpt4 key购买 nike

在下面的示例中,派生类的编写者将被期望调用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com