Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# OO泛型设计注意事项_C#_Generics_Oop - Fatal编程技术网

C# OO泛型设计注意事项

C# OO泛型设计注意事项,c#,generics,oop,C#,Generics,Oop,以下是我正在努力寻找合适设计的情况 我需要存储数字的配置文件。个人资料只是一系列数字。它们可以是int、float或decimal类型。每个配置文件都有一个基于ennumeration的ProfileDescription字段 每个概要文件都有一个ProfileVersion对象的集合。每个ProfileVersion对象都有一个ProfileValue对象的集合。这些ProfileValue对象是存储所需类型的实际数值的位置 我最初的设计思想是使Profile、ProfileVersion和P

以下是我正在努力寻找合适设计的情况

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

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

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

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

另一个想法是,我应该使用ProfileBase类,然后使用GenericProfileClass或IntProfile、FloatProfile和DecimalProfile对其进行子类化,但这并没有给我带来任何比每个类都是泛型的优势,因为我每次都必须抛出子类

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


谢谢

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


无论如何,你想用C语言做的事情并不容易,因为C语言中没有基本的数字类型,很遗憾。

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

class ProfileList : IList<T> where T: IProfile
class ProfileList:IList其中T:IProfile
因此,您将拥有的唯一约束是接口,而不是特定类型或铸造基类

至于:

另一个想法是我应该使用 ProfileBase类,然后将其子类化 使用GenericProfileClass或 IntProfile、FloatProfile和 DecimalProfile,但这不会 真的比我有优势吗 每个类都是泛型的,就像我 将不得不抛出子类 反正每次都是

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