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

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


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 [],但这似乎是一种hack。有任何想法吗?


四季花海
浏览 136回答 2
2回答

慕尼黑5688855

我看不到您要达到的目标,该类和方法看起来不错。您可以使用Decorator模式链接方法,但似乎还需要几个结果?如果要使用相同的方法名称和签名,则可以使用显式接口实现,这实际上不是一个好习惯。您甚至可以采用真正的肮脏方式,并使用带有方法名和签名的接口。派生标记接口(这是一个ANTI模式!)。显式实现派生的接口。通过对自己进行反思并调用所有“其他”接口方法来实现基本接口……但是不要为了……而一切!

缥缈止盈

问题是返回的结果。每次通话都不同。这似乎是对Composite模式的不当使用。Composite背后的总体思路是,您不关心是否使用Composite或其任何组成部分,因为它们在逻辑上是可互换的。为了说明,假设您有一个抽象interface IPainter{&nbsp; &nbsp; double PaintedArea(double hours);}您有很多实现-class DiligentPainter : IPainter{&nbsp; &nbsp; double PaintedArea(double hours) => hours * 100;}class LazyPainter : IPainter{&nbsp; &nbsp; double PaintedArea(double hours) => hours * 20;}这是关键部分-考虑一下,您的客户可能不在乎他们是聘用单个画家还是工作人员。他们只在乎所有墙壁都被粉刷过。因此,您可以制作复合材料PainterCrew并将其作为单个画家使用-class PainterCrew : IPainter{&nbsp; &nbsp; readonly IEnumerable<IPainter> painters;&nbsp; &nbsp; PainterCrew(IEnumerable<IPainter> painters)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; this.painters = painters;&nbsp; &nbsp; }&nbsp; &nbsp; double PaintedArea(double hours)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; return this.painters.Sum(p => p.PaintedArea(hours));&nbsp; &nbsp; }}瞧,您不只是返回单个结果的集合,而是以一种有意义的方式对其进行汇总,因此从调用方的角度来看,它们是使用复合还是单个实体都无关紧要。
打开App,查看更多内容
随时随地看视频慕课网APP