對於某些類,理想情況下,我想創建特殊的命名實例,類似於「null」。據我所知,這是不可能的,所以相反,我創建類的靜態實例,用靜態構造函數,與此類似:C#如何創建一個類的特殊實例?
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實例的所有屬性都應該是可變的。每當我意外地有一個人物對象指的是沃爾多,而我不小心不檢查是否指的是沃爾多,那麼我不小心打斷了沃爾多的財產。
有沒有更好的方法,或者甚至有一些其他的替代方法來定義一個特殊的衆所周知的類實例?
我現在唯一知道的解決方案是實現獲取& set訪問器,並檢查每個集合上的「if(this == Waldo)throw new ...」。雖然這有效,但我認爲C#可以比我實現它做得更好。如果只有我可以找到一些C#方法來使沃爾多的所有屬性只讀(除了在靜態構造函數中)。
難道你不能在你的Waldo類中使用訪問器而不使用mutator嗎? – Brian
不是您的問題的直接答案,而是一個可能的方向:http://msdn.microsoft.com/en-us/library/ms750509.aspx和http://stackoverflow.com/questions/263585/immutable-object- pattern-in-c-sharp-what-do-you-think – hatchet
你可以定義一個接口'IPerson',並使'Waldo'成爲一個實現'IPerson'的類,同時'Person'實現它。然後你需要讓'Waldo'不可變,在這裏看看更多的信息你如何讓一個類不可變:http://stackoverflow.com/questions/352471/how-do-i-create-an-immutable-class –