公共财产与静态只读

时间:2010-08-02 15:14:39

标签: c# design-patterns

我正在尝试在三种不同的实现中做出决定。

我有一个IPerson界面,所有人类(即警察,学生,律师)都实现了这一点。每个人类型需要具有不同的AddressLocation(即家庭,办公室,邮件)。此位置永远不会更改,因此它可以是静态/只读。人们被一般地处理,所以我的保存方法SavePerson(IPerson人)接受从IPerson接口继承的任何东西,并且我有一个带ID的LoadPerson(int ID)方法。

我的初始解决方案是向IPerson添加DefaultLocation属性,并且只有一个getter。这样我就可以使用通用方法来保存数据。当我尝试加载数据时出现问题,因为我还没有类的实例,所以我无法引用该属性。

另一方面,我可以在每个人类型上创建一个公共静态只读DefaultLocation属性。在这种情况下,我可以调用Student.DefaultLocation并将其传递给加载我的数据的方法。

我应该走哪条路?为什么?两者似乎都有利有弊。

当我输入这个问题时,我遇到了第三个选项: 如果我使用了一个公共静态readonly proprty,它可以在没有类的实例化的情况下被引用,然后使用一个没有setter的公共属性,可以从泛型方法调用呢?

根据Jon的建议我去了:

public interface IPerson
{
    LocationType DefaultLocation { get; }
}

public class PoliceOfficer : IPerson
{
    public static readonly LocationType _DefaultLocationType = LocationType.Office;
    public LocationType { get { return _DefaultLocationType; } }
}

1 个答案:

答案 0 :(得分:2)

最后一个选项听起来对我来说是最好的 - 至少如果你希望每个类型的位置可用于其余的代码。如果不这样做,我只是在每种类型中使用私有只读静态字段,并从实例属性返回该值。 (我假设地点是不可变的。)

基本上,你在略微不寻常的方式中使用多态,因为它不依赖于特定对象的状态或任何特定行为,而是取决于类型的状态。请注意,通过在接口中使用属性而不是在构造函数中设置字段集的抽象基类,可以避免每个实例具有基本冗余数据的一个字段。