首先很抱歉这个问题太长了,但我不能把它写得更短了:)
现实世界的例子:我们有一卷大纸,上面印有小“贴纸”。每个贴纸都有一个代码。代码的前两个字母告诉我们这是什么类型的贴纸(代表新卷的贴纸,代表当前卷结束的贴纸,应该去质量控制的贴纸,......但大多数都是正常的枚举贴纸) .
例如带有代码 XX0001 的贴纸意味着,在它之后应该只有正常的枚举代码(如 NN0001 到 NN9999),始终是相同的数字。代码QC0001告诉我们,接下来的10个代码(从QC0001到QC0010)应该进入质量控制。
我设计的应用程序是这样的,每种类型的贴纸都是它自己的类 - NormalSticker
, BadSticker
, ControllSticker
, QualitySticker
,... 它们都继承自 SticerBase 类,该类包含所有这些的一些公共(public)数据(扫描质量、扫描日期和时间、代码内容)。这些类的实例在静态解析器类中创建,该类检查代码并将适当的对象返回给我们。
一切正常,但现在我停下来了。我还有一个 Roll
类,它有一组贴纸,实现为 List<StickerBase>.
这个类有一个公共(public)AddSticker(StickerBase)
方法,我们将贴纸添加到卷中。但是这个方法应该包含一些逻辑,例如如果我们得到代码XX001,那么接下来的9999张贴纸应该是从NN0001到NN9999。我在这里看到的唯一选择是根据贴纸的类型做出决定,例如:
public void AddSticker(StickerBase sticker)
{
if (sticker.GetType().Equals(typeof(StickerNewRoll)))
{
// Next 9999 sticker should be in the form of NN0001 to NN9999
}
if (sticker.GetType().Equals(typeof(EnumeratedSticker)))
{
// Add 9999 stickers to the list, other business logic...
}
if (sticker.GetType().Equals(typeof(QualitySticker)))
{
// Stop the machine and notify the worker
}
}
如果这是正确的方法,我会感到非常惊讶。有什么想法吗?
编辑 - 可能的解决方案:因为对于每张贴纸我都知道下一张应该是什么样子,我可以添加新方法 public Sticker NextStickerShouldLookLike()
每个Sticker
的方法类(class)。在验证逻辑中(类似于 Péter Török's answer )我可以检查当前标签是否与 previousSticker.NextStickerShouldLookLike()
相同. Validate 方法将有两个输入参数 - 当前和上一个标签。
最佳答案
您是要添加与一个特定贴纸关联的贴纸集,还是要验证添加的贴纸符合最新特贴设置的约束条件?
在第一种情况下,您可以将一个多态的 GetAssociatedStickers()
方法添加到您的贴纸类,它将从 NN0001 到 NN9999 的贴纸集返回到带有代码的贴纸XX001等,那你就可以把那套贴纸加在控制贴纸后面。
更新
为了验证,您可以在贴纸类中有一个新接口(interface) StickerValidator
和一个方法 GetValidator
。特殊贴纸会返回一个正确的验证器对象(可以实现为匿名类或内部类),而普通贴纸会返回 null
。然后 AddSticker
可以修改成类似的样子
public void AddSticker(StickerBase sticker)
{
if (sticker.GetValidator() != null)
{
this.validator = sticker.GetValidator();
// add the sticker to the list
}
else
{
if (this.validator == null || this.validator.validate(sticker))
{
// add the sticker to the list
}
else
{
// set error state
}
}
}
关于c# - 多态设计题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4885363/