【问题标题】:public property vs static readonly公共属性与静态只读
【发布时间】:2011-03-24 06:39:57
【问题描述】:

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

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

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

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

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

当我输入这个问题时,我想到了第三个选项: 如果我使用可以在没有类实例化的情况下引用的公共静态只读属性,然后使用没有可以从泛型方法调用的 setter 的公共属性怎么办?

根据 Jon 的建议,我接受了:

public interface IPerson
{
    LocationType DefaultLocation { get; }
}

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

【问题讨论】:

    标签: c# design-patterns


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2021-11-18
      • 1970-01-01
      • 2017-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多