Załóżmy, że scenariusz nie pozwala na implementację typu niezmiennego. Podążając za tym założeniem, chciałbym uzyskać opinie/przykłady, jak poprawnie zaprojektować typ, który po jego zużyciu staje się niezmienny.Zaprojektuj klasę zmienną, która po jej zużyciu stanie się niezmienna.
public class ObjectAConfig {
private int _valueB;
private string _valueA;
internal bool Consumed { get; set; }
public int ValueB {
get { return _valueB; }
set
{
if (Consumed) throw new InvalidOperationException();
_valueB = value;
}
}
public string ValueA {
get { return _valueA; }
set
{
if (Consumed) throw new InvalidOperationException();
_valueA = value;
}
}
}
Kiedy ObjectA
zużywa ObjectAConfig
:
public ObjectA {
public ObjectA(ObjectAConfig config) {
_config = config;
_config.Consumed = true;
}
}
nie jestem zadowolony, że to po prostu działa, chciałbym wiedzieć, czy istnieje lepszy wzór (wyłączone, jak powiedział, co ObjectAConfig
niezmienna przez projekt od początku).
Na przykład:
może sensu definiować monady jak
Once<T>
które pozwalają owinięty wartość zostać zainicjowany tylko raz?może w sensie zdefiniować typ, który zwraca sam typ zmieniający prywatne pole?
* Dlaczego * nie możesz wprowadzić niezmiennego typu? Pomogłoby to, gdybyś wyjaśnił prawdziwy problem, który próbujesz rozwiązać. –
[To pytanie] (http://stackoverflow.com/questions/4168382) ma kilka interesujących wzorców robienia podobnych rzeczy. –