OOGenerics设计考虑因素

时间:2009-03-17 10:39:35

标签: c# generics oop

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

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

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

我最初的设计理念是使Profile,ProfileVersion和ProfileValue具有通用性。当我想要一个不同类型的配置文件列表时,我遇到了一个问题,这是我不能拥有的。我可以改用ArrayList,但是我必须在其中抛出数据。

我虽然可能只使ProfileVersion和ProfileValue通用,然后让Profile对象根据ProfileDescription字段的值为ProfileVersion分配一个类型,但我找不到办法来做到这一点。

另一个想法是我应该使用一个ProfileBase类,然后使用GenericProfileClass或IntProfile,FloatProfile和DecimalProfile对它进行子类化,但是这对于让每个类都是通用的没有任何优势,因为我必须抛出它无论如何都要从子类中出来。

我很感激您对这种情况的最佳设计方法的看法。

由于

2 个答案:

答案 0 :(得分:2)

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

class ProfileList : IList<T> where T: IProfile

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

至于:

  

另一个想法是我应该使用一个   ProfileBase类然后将其子类化   使用GenericProfileClass或   IntProfile,FloatProfile和   DecimalProfile,但这不会   真的给我任何优势   每个班级都是通用的,就像我一样   必须抛弃子类   每次都是。

这些好处实际上取决于您为课程所做的抽象级别。如果设计得当,您可以理想地拥有操作/业务逻辑/或管理器类,可以接受任何这些基类型(再次通过泛型),而无需知道特定的演员。

答案 1 :(得分:1)

我不确定我是否正确理解您的问题(粘贴不起作用的代码会有所帮助),但我认为您可以尝试创建接口IProfileIProfileVersion等。并使泛型类继承接口Profile<T>:IProfile

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