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字段。
另外,沿着我正在咖啡因的其中一个评论的线程,你应该有一个集合作为类的一部分,而不是从集合继承。