【问题标题】:OOGenerics Design ConsiderationsOOGenerics 设计注意事项
【发布时间】:2009-03-17 10:39:35
【问题描述】:

这是我试图找到合适设计的情况。

我需要存储数字配置文件。配置文件只是一系列数字。它们可以是 int、float 或 decimal 类型。每个配置文件都有一个基于枚举的 ProfileDescription 字段。

每个配置文件都有一个 ProfileVersion 对象的集合。每个 ProfileVersion 对象都有一个 ProfileValue 对象的集合。这些 ProfileValue 对象是存储所需类型的实际数值的地方。

我最初的设计想法是让 Profile、ProfileVersion 和 ProfileValue 通用。当我想要一个不同类型的配置文件列表时,我遇到了一个问题,而我没有。我可以使用 ArrayList 代替,但我将不得不丢弃其中的数据。

我虽然可以只将 ProfileVersion 和 ProfileValue 设为通用,然后让 Profile 对象根据 ProfileDescription 字段的值为 ProfileVersion 分配一个类型,但我找不到这样做的方法。

另一个想法是我应该使用 ProfileBase 类,然后使用 GenericProfileClass 或 IntProfile、FloatProfile 和 DecimalProfile 对其进行子类化,但这并不会真正给我带来任何优势,因为我必须将每个类都设为泛型,因为我必须强制转换反正每次都出子类。

非常感谢您对这种情况的最佳设计方法的想法。

谢谢

【问题讨论】:

    标签: c# generics oop


    【解决方案1】:

    Grzenio 的想法是正确的。您的每个配置文件类都可以作为 IProfile 对象的实现,然后您的容器可以是:

    class ProfileList : IList<T> where T: IProfile
    

    因此,您将拥有的唯一约束是接口,而不是特定类型或强制转换的基类。

    至于:

    另一个想法是我应该使用 ProfileBase 类,然后将其子类化 使用 GenericProfileClass 或 IntProfile、FloatProfile 和 DecimalProfile,但这不会 真的给我任何优势 让每个类都是通用的,因为我 将不得不抛弃子类 反正每次都是。

    好处实际上取决于您为类所做的抽象级别。如果设计得当,理想情况下,您可以拥有可以接受任何这些基类型(同样通过泛型)的操作/业务逻辑/或管理器类,而无需知道具体的转换。

    【讨论】:

      【解决方案2】:

      我不确定我是否正确理解了您的问题(粘贴不起作用的代码会有所帮助),但我认为您可以尝试创建接口IProfileIProfileVersion 等并制作通用类继承接口Profile&lt;T&gt;:IProfile

      无论如何,你要做的事情并不容易,因为可悲的是,C# 中没有基本数字类型。

      【讨论】:

        猜你喜欢
        • 2012-05-16
        • 1970-01-01
        • 2011-06-06
        • 2012-08-28
        • 2016-12-26
        • 2014-10-06
        • 2013-06-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多