为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
四季花海 2021-05-17 17:14:15
我有一个具有多个具有相同签名的方法的类: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。有任何想法吗?
查看完整描述

2 回答

?
慕尼黑5688855

TA贡献1848条经验 获得超2个赞

我看不到您要达到的目标,该类和方法看起来不错。您可以使用Decorator模式链接方法,但似乎还需要几个结果?

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


查看完整回答
反对 回复 2021-05-23
?
缥缈止盈

TA贡献2041条经验 获得超4个赞

问题是返回的结果。每次通话都不同。


这似乎是对Composite模式的不当使用。Composite背后的总体思路是,您不关心是否使用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));

    }

}

瞧,您不只是返回单个结果的集合,而是以一种有意义的方式对其进行汇总,因此从调用方的角度来看,它们是使用复合还是单个实体都无关紧要。


查看完整回答
反对 回复 2021-05-23
  • 2 回答
  • 0 关注
  • 135 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信