我有一个具有多个具有相同签名的方法的类:
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 [],但这似乎是一个黑客攻击。有什么想法吗?
答案 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));
}
}
请注意,您不仅仅是返回一系列单个结果 - 您正在以有意义的方式对其进行汇总,因此无论来自调用方是否正在使用复合数,它都无关紧要或单个实体。