类中取消方法的模式

问题描述 投票:0回答:2
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;
}

这也不是威胁保存。

c# events
2个回答
1
投票

您无法覆盖

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
方法没有验证。因此,如果您能进行同样的检查,那就太好了。


0
投票

您的

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 继承。

© www.soinside.com 2019 - 2024. All rights reserved.