Dla niektórych klas, chciałbym utworzyć specjalne nazwane instancje, podobne do "null". O ile wiem, to nie jest możliwe, więc zamiast tworzyć statyczne instancje klasy, ze statycznym konstruktorze, podobny do tego:C# Jak tworzyć specjalne wystąpienia klasy?
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;
}
}
Jak widać, Person.Waldo jest szczególnym przypadkiem klasa Person, którą utworzyłem, ponieważ w moim programie istnieje wiele innych klas, które mogą chcieć odwołać się do tej specjalnej, dobrze znanej instancji.
Minusem implementacji w ten sposób jest to, że nie znam żadnego sposobu, aby wszystkie właściwości Person.Waldo były niezmienne, podczas gdy wszystkie właściwości "normalnej" instancji Person powinny być zmienne. Ilekroć przypadkowo mam przedmiot Person odnoszący się do Waldo, a ja niedbale nie sprawdzam, czy to odnosi się do Waldo, to przypadkowo włamuję się do właściwości Waldo.
Czy istnieje lepszy sposób, a nawet kilka dodatkowych alternatywnych sposobów definiowania specjalnych znanych instancji klasy?
Jedyne rozwiązanie, jakie znam teraz, to implementacja akcesoriów get & i zaznaczenie "jeśli (to == Waldo) wyrzuć nowe ..." na każdym zestawie. Podczas gdy to działa, zakładam, że C# może wykonać lepszą pracę niż ja przy jego wdrażaniu. Jeśli tylko znajdę sposób C#, aby wszystkie właściwości Waldo były odczytane (z wyjątkiem konstruktora statycznego).
Nie możesz po prostu użyć akcesora w swojej klasie Waldo i nie użyć mutatora? – Brian
Nie jest to bezpośrednia odpowiedź na Twoje pytanie, ale możliwy kierunek: http://msdn.microsoft.com/en-us/library/ms750509.aspx i http://stdnowe%C5%9Broowy.com/questions/263585/immutable-object- pattern-in-c-sharp-what-do-you-think – hatchet
Możesz zdefiniować interfejs 'IPerson' i uczynić' Waldo' klasą implementującą 'IPerson', a także' Person' ją implementującą.Następnie trzeba dokonać 'Waldo' niezmienne, zajrzyj tutaj po więcej informacji jak zrobić klasę niezmienna: http://stackoverflow.com/questions/352471/how-do-i-create-an-immutable-class –