具有相同签名的多个方法的重构类

时间:2018-05-02 11:13:53

标签: c# oop design-patterns composite

我有一个具有多个具有相同签名的方法的类:

string MethodA(int id);
string MethodB(int id);
string MethodC(int id);

这些方法的实现明显不同,但我试图让它更加坚固。我对Composite模式有很长的路要走,其中Composite类将在下面实现IDoSomething接口:

public Interface IDoSomething
{
   string DoSomething(int id);
}

public class CompositeClass : IDoSomething
{
    private readonly IEnumerable<IDoSomething> somethings;
    public CompositeClass(IEnumerable<IDoSomething> somethings)
    {
        this.somethings = somethings;
    }

    public string DoSomething(int id)
    {
        foreach (var s in somethings)
        {
            return s.DoSomething(id);
        }
    }
}

问题是返回的结果。每个电话都有所不同。我可以将签名更改为string [],但这似乎是一个黑客攻击。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

我没有看到你想要实现的目标,课程和方法看起来很好。您可以使用Decorator模式链接方法,但似乎您还需要几个结果?

如果你想要相同的方法名和签名,你可以使用显式接口实现,这不是一个好的做法。 您甚至可以采用非常脏的方式并使用具有Methodname和签名的界面。派生标记接口(这是一种ANTI模式!)。显式实现派生接口。通过使用自己的反射并调用所有“其他”接口方法来实现基接口......但是为了......一切都不要这样做!

答案 1 :(得分:1)

  

问题是返回的结果。每个电话都有所不同。

这似乎是对Composite模式的不当使用。复合材料背后的一般理念是,您不关心您是否使用复合材料或其任何成分,因为它们在逻辑上是可互换的。

为了说明,假设你有一个抽象

interface IPainter
{
    double PaintedArea(double hours);
}

你有很多实现 -

class DiligentPainter : IPainter
{
    double PaintedArea(double hours) => hours * 100;
}

class LazyPainter : IPainter
{
    double PaintedArea(double hours) => hours * 20;
}

这是一个关键部分 - 想到这一点,你的客户可能不关心他们是雇用一个画家还是一个工作人员。他们只关心他们所有的墙都被涂上了。

所以你可以制作一个复合PainterCrew并让它作为一个画家工作 -

class PainterCrew : IPainter
{
    readonly IEnumerable<IPainter> painters;

    PainterCrew(IEnumerable<IPainter> painters)
    {
        this.painters = painters;
    }

    double PaintedArea(double hours)
    {
        return this.painters.Sum(p => p.PaintedArea(hours));
    }
}

请注意,您不仅仅是返回一系列单个结果 - 您正在以有意义的方式对其进行汇总,因此无论来自调用方是否正在使用复合数,它都无关紧要或单个实体。