2016-05-23 186 views
0

我会抽象地说一点,使问题陈述简洁和简洁。出于所有目的,我们假设.NET/C#作为底层技术/语言。一种类型与多种类型

假设您正在编写一个软件程序并设计一些类/类型来表示某个感兴趣的实体。你会发现这个实体有一些不同状态的生命周期。当这个实体从一个状态过渡到另一个状态时,它们获得了某些属性/属性但是失去了其他的属性。

现在,如果您要设计一个类/类型来表示这样的实体,则一种设计选择将是引入一种包含整个生命周期中实体的所有可能属性的超集的全包类类型。

另一种选择是引入某种类型的层次结构,其中您使用不同的类型表示感兴趣的实体,其中每个类型代表特定状态下的实体。

现在我的问题是:

  1. 一般而言,怎么能决定是否代表一个实体的不同状态/方面采用性能更好的完成/属性上单一类型对不同类型的?

  2. 如果您选择使用多种类型来表示你的实体:

    一个。你将如何处理这个实体的某些特性在多个状态中存在/定义的情况?

    b。如果你的实体使用JSON被持久化/序列化了呢?考虑到所有代表不同的状态的不同类型,你将如何序列化并反序列化它?

回答

0

你可能要考虑立足围绕.NET ExpandoObject(MSDN link)这样的对象 - 你可以动态地添加/删除属性,并询问是否有一个给定的属性这给你更多的灵活性比努力。创建一个完整的(静态)层次结构

0

如果您需要使用多种类型,可以通过复制构建实例或使用工厂创建新类型的实例来将实例从一种类型提升和降级到另一种类型。

但是,我不会单独依赖类型层次结构,因为内部状态是unavoida在状态机中。

2

您的解决方案都不是特别好。你真正想要的是代数数据类型,又名不相交或有区别的工会。不幸的是,大多数老派的OO语言都没有这些语言。在.NET生态系统中,主要是F#有适当的支持。见例如herehere作简要介绍。