【发布时间】:2013-06-24 23:03:38
【问题描述】:
对于某些类,理想情况下,我想创建特殊的命名实例,类似于“null”。据我所知,这是不可能的,所以我使用静态构造函数创建类的静态实例,类似于:
public class Person
{
public static Person Waldo; // a special well-known instance of Person
public string name;
static Person() // static constructor
{
Waldo = new Person("Waldo");
}
public Person(string name)
{
this.name = name;
}
}
如您所见,Person.Waldo 是我创建的 Person 类的一个特殊实例,因为在我的程序中,有很多其他类可能想要引用这个特殊的知名实例。
实现这种方式的缺点是我不知道有什么方法可以使 Person.Waldo 的所有属性不可变,而“普通” Person 实例的所有属性都应该是可变的。每当我不小心有一个 Person 对象引用了 Waldo,并且我不小心没有检查它是否引用了 Waldo,然后我不小心破坏了 Waldo 的属性。
有没有更好的方法,甚至是一些额外的替代方法来定义一个类的特殊知名实例?
我现在知道的唯一解决方案是实现 get & set 访问器,并在每个集合上检查“if (this == Waldo) throw new ...”。虽然这可行,但我认为 C# 在实现它方面比我做得更好。如果我能找到一些 C# 方法来使 Waldo 的所有属性只读(静态构造函数期间除外)。
【问题讨论】:
-
你不能只在你的 Waldo 类中使用访问器而不使用 mutator 吗?
-
不是直接回答您的问题,而是可能的方向:msdn.microsoft.com/en-us/library/ms750509.aspx 和 stackoverflow.com/questions/263585/…
-
您可以定义一个接口
IPerson并使Waldo成为实现IPerson的类,Person也实现它。然后你需要使Waldo不可变,查看这里了解如何使类不可变的更多信息:stackoverflow.com/questions/352471/… -
有趣的问题。以前从来没有这样做过,但如果你想让它真正不可变,我认为你将 Person 的方法实现为虚拟的,然后创建一个继承自 Person 的 Waldo 类。构造函数设置所有你重写的属性,只有获取方法,没有设置,然后你重写方法什么都不做,或者只返回值,不修改它们。
-
@WojciechKulik - 这发生在 .Net 中。例如,在 System.Drawing 中,Pen 类有一个称为不可变的私有字段。它有一个内部构造函数,它接受一个允许创建者指定实例是否不可变的值。这用于创建和分发“特殊” Pen 对象。这些特殊的 Pen 对象由 Pens 类公开。在这种情况下,Microsoft 使用的模式类似于我上面链接的 Frozen 类。对象知道它是可变的还是不可变的,并且任何会改变状态的属性或方法首先检查以确保实例是可变的。