我们有一个对象库Person
,Cat
,Dog
,Pencil
和Byke
。
让我们给Person
FavoriteThing
成员,该成员可以是任何列出的类型。
让我们假设我们必须使用序列化来保存Person的状态,因此我们将所有列出的对象都设为Serializable
。
我们现在如何保护人员免于“注射”他像Cobra
类的“FavoriteThing”,这不符合要求(可序列化,或其他,如无害的)。
答案 0 :(得分:3)
我不确定你想要实现什么,但如果你想以某种方式想要定义哪些类型应该被分配给FavoriteThing
,你可以创建一个空接口(让我们调用)它IFavorable
),并声明FavoriteThing
属于该类型;
public interface IFavorable { }
class Person
{
public IFavorable FavoriteThing { get; set; }
}
然后你让允许的类型“实现”这个界面:
class Dog : IFavorable
{
// ...
}
这样可行,但我自己并不是这种“元接口”的忠实粉丝......
答案 1 :(得分:2)
您可能希望编写一个充当tagged union的FavoriteThing
类型。换句话说,它具有每种类型(人,猫等)的属性,但强制它一次只包含一个值。如果这些都是引用类型,您可能不会明确需要标记字段;只需确保一次只有一个强类型字段为非null。您需要提供一种方法来确定哪个类型具有值。
另一个选择是让所有这些类型实现一个通用接口 - 但可能不适合设计,如果这些类型不应该真正了解“最喜欢”的概念。
如果不知道你最想做什么就很难更具体......
答案 2 :(得分:1)
最近发布的相关帖子,这与List<object>
相关,是吗?
在这种情况下,我不会使用object
- 我会使用一个共同的基类:
[Serializable]
public class FavoriteThing {} // this is probably a bad name...
[Serializable]
public class Dog : FavoriteThing {}
[Serializable]
public class Pencil : FavoriteThing {}
(使用List<FavoriteThing>
代替List<object>
)
请注意,不强制执行[Serializable]
- 没有编译器检查可以做到这一点;但它确实让它保持理智的价值 - 即不是(ranadomly)HttpWebRequest
此外,多个序列化程序可以很好地使用基类模型,不会使用随机object
- 例如DataContractSerializer
,{{1}通常我更喜欢封装而不是继承,但对于序列化/ DTO,基类通常是最简单的选项。