【问题标题】:List of two different Types in C#C# 中两种不同类型的列表
【发布时间】:2008-11-25 13:15:31
【问题描述】:

我目前在为我的客户使用 ShoppingCart 时遇到问题。

他希望能够在 CartItems 之间添加文本,所以我想知道是否有某种方法仍然只有一个列表。

我的解决方案是有两个列表,一个是 IList 类型,它在计算购物车的重量和总价格时被迭代,而另一个 IList 只公开在 ListView 中显示它的必要字段,这是一个 SuperType购物车项目。 (但是我如何访问 listView 的其他字段,在 Description-Text-Class 中将重量和价格默认为 0 会破坏 LSP)。

但是有两个列表在某种程度上感觉有点奇怪(并且仍然给我带来问题),所以我想知道我是否可以做某种类型的列表来指定每个项目的类型。

欢迎提出任何建议,我对这两种选择都不太满意。

【问题讨论】:

    标签: c# listview list


    【解决方案1】:

    使用接口:

     ICartListItem
    

    并让您的清单成为:

     List<ICartListItem>
    

    现在,创建几个类型,让它们都实现这个接口,然后你就可以将它们安全地存储在你的列表中了。

    或者,如果您希望 CartItem 中有一些默认逻辑,请使用基类而不是接口。

    【讨论】:

    • 嗨,我已经考虑过接口方法。但我认为我会违反 LSP,因为 CartListItem 具有附加属性(重量、价格),而 TextListItem 只有文本。但现在我想起来这不是什么大问题。
    【解决方案2】:

    您可以创建一个类,并在其中定义所需列表类型的属性,然后创建一个相同类的列表。

    例如,如果我想列出strings 和bools,我会在一个类中创建两个属性,然后列出该类。

    【讨论】:

      【解决方案3】:

      界面听起来有点矫枉过正。我只需向您当前的 CartItem 添加一个名为“TextAfterItem”之类的属性。

      另外:确保您的客户了解此功能在安全开销方面的成本。听起来他们认为这应该是一个简单的更新,但您允许用户输入将直接显示回页面的文本,这是一个危险的提议。

      【讨论】:

      • 顺便说一句,这不是真正的问题,因为。它是一个 Windows 窗体应用程序,我的 SQL 查询是通过 NHibernate 完成的,因此不会向数据库注入任何内容,也不会在输出时执行恶意脚本。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-04
      • 2021-11-19
      • 2021-12-25
      相关资源
      最近更新 更多