使用不同子类的通用方法有效地设计类

时间:2014-09-27 10:46:04

标签: c# oop

我有这个小设计问题,我希望找到最佳解决方案。

我有一个父类A,其他类的对象说B类,C..etc。我有6个这样的子课程。

现在每个子类都必须从父类调用一些方法。 公共方法调用一些委托,从父类发送事件。

所以结构是:

class ParentA
{
   Child B, C, D, E, F, G;

   CommonMethod()
   {
      //Common task
      CallDelegate();
   }
}

当前的解决方案是将父类的对象传递给所有6个子类。通过哪些子类访问常用方法。

我想知道是否有更好的方法来完成这项工作。

例如。将commonMethod设为静态,因为我不需要将父参考传递给每个子类。另外,我不想公开CommonMethod。

请建议更好的方法,或者让我知道目前的实施是否足够好。

2 个答案:

答案 0 :(得分:2)

您可以将方法作为delegate传递给子类,而不是整个ParentA类。通过这种方式,Child只需要提供它想要运行的方法,这就是它所关心的。

public class ParentA
{
    Child B, C, D, E, F, G;

    public void Setup()
    {
        // pass CommonMethod or even just CallDelegate to the child classes
        B.SetParentMethod(this.CommonMethod);
        C.SetParentMethod(this.CommonMethod);
        D.SetParentMethod(this.CommonMethod);
        E.SetParentMethod(this.CommonMethod);
        F.SetParentMethod(this.CommonMethod);
        G.SetParentMethod(this.CommonMethod);
    }

    private void CommonMethod()
    {
        //Common task
        CallDelegate();
    }
}

public class Child
{
    private Action parentMethod;

    public void SetParentMethod(Action parentMethod)
    {
        this.parentMethod = parentMethod;
    }

    public void DoSomeAction()
    {
        // call the common task
        this.parentMethod();
    }
}

答案 1 :(得分:1)

大部分相当于Rhumbori的解决方案,但使用的是事件。根据您未说明的要求,可以接受或优先考虑另一个。事件对您的方法签名提出了一些要求,可能不合适。

class A {
    B x, y, z;

    void Init() {
        x.Something += Common;
        y.Something += Common;
        z.Something += Common;
    }

    void Common(object sender, EventArgs e) {

    }
}

class B {
    public event EventHandler Something;

    public void OnSomething() {
        if (Something != null)
            Something(this, EventArgs.Empty);
    }
}