public class Foo : Collection<string>
{
bool _cancel = false;
public void AddWithoutDoingStuff(string item)
{
_cancel = true;
Add(item);
_cancel = false;
}
protected override void InsertItem(int index, string item)
{
base.InsertItem(index, item);
if (!_cancel)
{
//Do some stuff
}
}
}
我想知道是否有一种模式可以避免这个丑陋的_cancel成员?我在这里发现了一些东西: 暂时停止表单事件的引发或处理? 但这仅适用于事件。
编辑 抱歉我没有很好地表达自己。这只是一个例子。显式基类并不重要。我想要求的是一个通用的解决方案,以避免在这种情况下使用 _cancel 变量。我不喜欢本例中的 AddWithoutDoingStuff 方法。如果出现错误,它不会保存,所以我必须这样做:
try
{
_cancel = true;
Add(item);
}
finally
{
_cancel = false;
}
这也不是威胁保存。
您无法覆盖
Add
方法的工作方式。它只是调用 InsertItem
而不需要任何额外的参数。这意味着在 InserItem
中添加一些附加参数的唯一方法是通过类字段传递它们(您的解决方案)。
但是如果您不调用基本
Add
方法,您可以控制插入项目之前/之后执行或不执行的操作
public class Foo : Collection<string>
{
public void AddWithoutDoingStuff(string item)
{
if (Items.IsReadOnly())
throw new NotSupportedException();
base.InsertItem(Count, item);
}
protected override void InsertItem(int index, string item)
{
base.InsertItem(index, item);
// Do Some Stuff
}
}
注意:不幸的是,检查内部 Items 是否是在基类的
Add
方法中只读完成的。并且InsertItem
方法没有验证。因此,如果您能进行同样的检查,那就太好了。
您的
Collection
object
不需要也不应该有 _cancel bool,
,尤其是因为我们正在谈论表格。
如果您所说的 Forms 指的是 WinForms,并且我们在这里
event
驱动,我想您也是如此,那么处理此问题的正确方法是从 UI 或调用方法中检索任何取消作为参数,并在之前解决它调用集合。不执行一个进程比执行一个进程然后取消它要好。示例(在代码中假设未声明的变量):
DialogResult dr = MessageBox.Show("Do this?", "Question", MessageButton.OKCancel);
myFoo.InsertItem(myIndex, myItem, (r != DialogResult.Cancel ? true : false);
当然,您可以稍微修改一下 InsertItem 方法:
protected void InsertItem(int index, string item, bool _cancel)
{
base.InsertItem(index, item);
if (!_cancel)
{
//Do some stuff
}
}
它不一定是 MessageBox。我只是用它来说明管理切换的正确方法,而无需在类中使用丑陋的 _cancel 字段。
另外,现在我正在喝咖啡,沿着一条评论的线索,你应该有一个集合作为类的一部分,而不是从 Collection 继承。