2017-01-13 19 views
3
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

由于您的业务逻辑(集合之外)决定是否应将“其他内容”插入到集合中,因此您应该重新考虑放置“附加内容”逻辑。在我看来,它不应该在收藏。 –

+0

我建议创建一个自定义集合。实施ICollection 或IList 。收集在您的情况下无法正常工作。 – Sefe

回答

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 
    } 
} 

注后:不幸的是检查是否内部项目在基地CALSS的Add方法只读完成。并且在InsertItem方法中没有验证。所以如果你能做同样的检查会很好。

+0

您可以创建InsertItem重载而不是新方法。此外,AddWithoutDoingStuff方法名称会引起误解,因为它会执行一些操作:)。但是,你的方法可能是正确的。 –

+0

@DarjanBogdan是的,根据名称不应该做的事情,如果该方法被称为:)更新 –

0

您的Collectionobject不需要,也不应该有_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 
    } 
    } 

它不必是一个MessageBox。我只是用它来说明在班级中没有丑陋的_cancel字段的情况下管理切换的正确方法。

另外,沿着现在我正在咖啡的评论之一的线索,你应该有一个集合作为类的一部分,notsomuch从Collection继承。

+0

没有虚拟的InsertItem方法接受额外的参数 –

+0

复制粘贴oopsie之前,我的咖啡是在我的系统。 – CDove