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成员?我发现了一些东西: Temporarily stop form events from either being raised or being handled? 但这仅适用于事件。
修改 对不起,我没有表达自己。这只是一个例子。显式基类无关紧要。我想要的是在这种情况下避免_cancel变量的一般解决方案。我不喜欢AddWithoutDoingStuff方法,就像在这个例子中一样。如果出现错误,则无法保存,因此我必须执行以下操作:
try
{
_cancel = true;
Add(item);
}
finally
{
_cancel = false;
}
这也不是威胁保存。
答案 0 :(得分: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
}
}
注意:不幸的是检查内部项是否在Add
基础calss方法中完成。并且InsertItem
方法中没有验证。所以如果你做同样的检查会很好。
答案 1 :(得分: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。