【发布时间】:2020-08-26 15:50:22
【问题描述】:
假设我想做一个馅饼烘焙应用程序。它应该能够创建一个苹果派以及一个草莓派。但我希望以后可以选择添加更多不同的馅饼类型。于是我做了一个叫IPie的接口,像这样:
interface IPie
{
List<string> Ingredients { get; set; }
IPieMaker Maker { get; set; }
}
interface IPieMaker
{
Task MakePie();
}
然后我可以为每种类型的饼实现IPieMaker。例如。苹果派,像这样:
public AppliePieMaker : IPieMake
{
public Task MakePie()
{
// ...do something with ingredients, specific to the apple pie
}
}
实际的实现内置在特定的饼图中。例如,苹果派可能如下所示:
public class ApplePie : IPie
{
List<string> Ingredients { get; set; } = new List<string> { "Apples", "Flour", "Eggs" };
IPieMaker Maker { get; set; } = new ApplePieMaker();
}
所以无论馅饼的类型如何,我始终确信它可以制作出来。像这样:
var pies = new List<IPie>
{
new ApplePie(),
new StrawBerryPie(),
};
foreach (var pie in pies)
{
pie.Maker.MakePie();
}
现在真正的问题来了:
以上所有都取决于 maker 是 pie 类的属性(IPie 的实现)。如果我想要一个更实用的方法,其中PieMaker 在类之外?所以我这样称呼它:
// From here, the pies are simple dumb data structures
var pies = new List<IPie>
{
new ApplePie(),
new StrawBerryPie(),
};
foreach (var pie in pies)
{
var maker = new PieMaker(pie);
maker.MakePie();
}
如何让PieMaker 类处理不同类型的饼图?显然,它可以从一个巨大的 switch 语句开始,然后将调用路由到特定的 pie 制造商(ApplePieMaker、StrawberryPieMaker 等),但这不是一个不好的做法吗?您将如何在函数式编程中做到这一点?
(我知道我不是在做实际的函数式编程,但我喜欢它的简单性,这就是为什么我对较少面向对象的方法感到好奇)。
【问题讨论】:
标签: c# interface open-closed-principle