.NET中的受限对象类型

时间:2010-12-03 11:24:11

标签: .net oop

我们有一个对象库PersonCatDogPencilByke

让我们给Person FavoriteThing成员,该成员可以是任何列出的类型。

让我们假设我们必须使用序列化来保存Person的状态,因此我们将所有列出的对象都设为Serializable

我们现在如何保护人员免于“注射”他像Cobra类的“FavoriteThing”,这不符合要求(可序列化,或其他,如无害的)。

3 个答案:

答案 0 :(得分:3)

我不确定你想要实现什么,但如果你想以某种方式想要定义哪些类型应该被分配给FavoriteThing,你可以创建一个空接口(让我们调用)它IFavorable),并声明FavoriteThing属于该类型;

public interface IFavorable { }

class Person
{
    public IFavorable FavoriteThing { get; set; }
}

然后你让允许的类型“实现”这个界面:

class Dog : IFavorable
{
    // ...
}

这样可行,但我自己并不是这种“元接口”的忠实粉丝......

答案 1 :(得分:2)

您可能希望编写一个充当tagged unionFavoriteThing类型。换句话说,它具有每种类型(人,猫等)的属性,但强制它一次只包含一个值。如果这些都是引用类型,您可能不会明确需要标记字段;只需确保一次只有一个强类型字段为非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,基类通常是最简单的选项。