类中取消方法的模式


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中包含一些其他参数的唯一方法是通过类字段(您的解决方案)传递它们。

但是,如果您不调用 base 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
    }
}

注意:不幸的是,检查内部项目是否以Add基本计算方法只读完成。并且InsertItem方法都没有验证。因此,如果您进行相同的检查,那就太好了。

你的Collection object不需要也不应该有_cancel bool,,特别是因为我们谈论的是表单。

如果您所说的窗体是指 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
    }
  }

它不必是消息框。 我只是用它来说明管理切换的正确方法,而无需在课堂上设置那个丑陋的_cancel字段。

另外,沿着我正在咖啡因的其中一个评论的线程,你应该有一个集合作为类的一部分,而不是从集合继承。

最新更新