我有这个小设计问题,我希望找到最佳解决方案。
我有一个父类A,其他类的对象说B类,C..etc。我有6个这样的子课程。
现在每个子类都必须从父类调用一些方法。 公共方法调用一些委托,从父类发送事件。
所以结构是:
class ParentA
{
Child B, C, D, E, F, G;
CommonMethod()
{
//Common task
CallDelegate();
}
}
当前的解决方案是将父类的对象传递给所有6个子类。通过哪些子类访问常用方法。
我想知道是否有更好的方法来完成这项工作。
例如。将commonMethod设为静态,因为我不需要将父参考传递给每个子类。另外,我不想公开CommonMethod。
请建议更好的方法,或者让我知道目前的实施是否足够好。
答案 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);
}
}