首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OOGenerics设计注意事项

OOGenerics设计注意事项
EN

Stack Overflow用户
提问于 2009-03-17 10:39:35
回答 2查看 88关注 0票数 2

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

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

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

我最初的设计想法是让Profile、ProfileVersion和ProfileValue成为通用的。当我想要一个不同类型的配置文件列表时,我遇到了一个问题,但我不能拥有。我可以使用ArrayList代替,但这样我就必须转换其中的数据。

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

另一个想法是我应该使用一个ProfileBase类,然后用GenericProfileClass或IntProfile、FloatProfile和DecimalProfile对它进行子类化,但这并不会给我带来比每个类都是泛型类更多的优势,因为我每次都必须逐出子类。

对于这种情况,我将非常感谢您对最佳设计方法的看法。

谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-03-17 10:52:52

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

代码语言:javascript
复制
class ProfileList : IList<T> where T: IProfile

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

至于:

另一个想法是,我应该使用ProfileBase类,然后用GenericProfileClass或IntProfile、FloatProfile和DecimalProfile对它进行子类化,但这并不会给我带来比每个类都是泛型类更多的优势,因为我每次都必须逐出子类。

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

票数 2
EN

Stack Overflow用户

发布于 2009-03-17 10:43:28

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/653698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档