c# - 当职责不属于该类时,使用多态性而不是条件

标签 c# oop polymorphism solid-principles

我在开发一个非常简单的应用程序时遇到了一些问题,该应用程序是学校项目的一部分。

这是一个非常基本的基于控制台的员工管理系统,您可以在其中添加 4 种类型的员工(全职、兼职、契约(Contract)、季节性,所有员工都具有几个不同的属性。)

我遇到的问题是显示用于修改特定员工类型的菜单时。

对员工类型执行 switch 语句显然是相当糟糕的设计,但是向每个员工类添加“DisplayModificationMenu”以便它可以显示自己的菜单似乎也很糟糕,因为显示菜单似乎不是适当的责任对于雇员对象本身。

解决此设计问题的最佳方法是什么?我考虑过创建一个 Menu 类并对每个菜单进行子类型化,以便每个菜单都可以显示自己,但即便如此,我觉得类型上的切换仍然会发生在某个地方来决定要实例化哪个菜单。

修改员工的工作流程是通过 ID 选择员工,然后应显示该员工类型的正确菜单。因此,即使使用子类型菜单,您似乎也必须先检查员工类型,然后才能知道要实例化哪个菜单。

预先感谢您的任何建议。

最佳答案

我认为对对象的类型进行切换不是问题,只要它被正确封装、记录和理解即可。

在您的情况下,您可以创建DisplayMenuFactory,它将接受抽象员工对象并返回抽象菜单类。在内部,它将根据员工类型进行切换,并为每种类型返回具体的菜单类。而且,如果您最终拥有具有相同切换机制的不同工厂,您可以将它们合并在一起,并且这种切换将始终发生在单个类中。因此,为不同员工创建不同 UI 的责任将在这个单一类中。

第二个选项是让 Employee 类具有 GetMenu 方法,该方法将为每个员工类型返回具体的菜单类型。但这是混合模型和 UI,在这种情况下我认为这是 Not Acceptable 。

关于c# - 当职责不属于该类时,使用多态性而不是条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13782502/

相关文章:

c# - 使用转换器中的资源

Java 接口(interface)——为什么没有私有(private)方法?

java - super . super .func()? - Java多态性

c# - 使用 UNION、INTERSECT 或 EXCEPT 运算符组合的所有查询在其目标列表中必须具有相同数量的表达式

c# - 为什么 Html.Checkbox ("Visible") 在 ASP.NET MVC 2 中返回 "true, false"?

java - 对 2 个分数的操作

虚拟调用中的 C++ 非虚拟函数调用

Java:为什么通过将子类保存为父类,子类的属性会变成父类的默认值?

c# - Moq'ing 方法,其中 Expression<Func<T, bool>> 作为参数传入

java - 如何制作预设的唯一类对象