当使用MVC/MCP时,如何在UI上处理没有开关语句的派生类

本文关键字:处理 开关 语句 派生 UI MVC MCP | 更新日期: 2023-09-27 18:07:30

我使用MVC/MCP模式为我的c# (WinForms)应用程序。

在业务逻辑中,我有像 这样的派生类
abstract public class Item
{
    abstract double CalculatePrice();
    ...
}
public class Nail : Item
{
    ...
}
public class Car : Item
{
    ...
}

对于业务逻辑,项的派生类型无关紧要。我总是可以调用像CalculatePrice()这样的方法,无论项目的实际类型是什么。

但是我如何处理这些项目在UI (WinForms),当这些项目呈现给用户?(当然,CarNail的呈现方式不同)

  • 我不想在UI/控制器中有一个大的开关语句来处理所有类型的项目。
  • 我不想实现

    方法,因为这是业务逻辑,它不应该关心UI的东西

那么最干净的设计方法是什么呢?

提前感谢!!

当使用MVC/MCP时,如何在UI上处理没有开关语句的派生类

在我看来,您需要一个视图的策略模式,对吗?

我用MVP解决这个问题的一种方法是创建UserControl子视图。我甚至会在子视图中使用Presenter。如果你可以将你的主视图模块化成UserControl组件,或者如果它有意义,那么这可能是一个选项。

你可以实现一个字典来知道要将哪个子视图添加到父控件的容器中。

或者,我记得,我确实使用了一个字典,它的值是一个委托来显示给定父控件的特定子视图。

我不明白你为什么需要抽象方法ComputePrice。一件商品的价格大概在数据中。如果是这种情况,那么您所需要的只是在基类Item中添加一个属性Price,以获取任何Item实例的价格。

对于其他常见字段,如名称、描述、销售量等,它也会起同样的作用。然后,与Price属性类似,向Item基类添加一个属性(Name、Description、SalesVolume)。

可能某项商品的价格在数据中没有明确显示,必须计算。如果是这样的话,我仍然不明白为什么这个计算不能在基类中。例如,目录价格必须根据客户的不同而打折。在这种情况下,Item类应用折扣规则和正在进行购买的客户。

也许你可以解释为什么ComputePrice必须是一个抽象和/或给出其他抽象的例子,这些抽象需要在每个派生类(Nail, Car)中有一个特定的实现。