c# - 多态设计题

标签 c# .net oop design-patterns polymorphism

首先很抱歉这个问题太长了,但我不能把它写得更短了:)

现实世界的例子:我们有一卷大纸,上面印有小“贴纸”。每个贴纸都有一个代码。代码的前两个字母告诉我们这是什么类型的贴纸(代表新卷的贴纸,代表当前卷结束的贴纸,应该去质量控制的贴纸,......但大多数都是正常的枚举贴纸) .

例如带有代码 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/

相关文章:

c# - .NET 核心 Entity Framework - 转义 "@"字符

c# - Prism 实际上为开发人员提供了什么?值得吗?

c# - 进度条没有显示进度结果?

java - 当一个对象作为类型父类(super class)传入时,有没有一种方法可以检索子类的类型?

java - 关于对单个字符串使用域对象的意见

java - Java开发人员的Ruby类定义说明

c# - 如何使用 C# 将 PDF 打印到 ZPL(Zebra 打印机)?

c# - 将 ListView 项目转换到 List<string>?

c# - 如何保存 Linq-to-SQL 中的更改?

c# - 我应该如何组织我的 C# 解决方案?