Ich stelle die Frage bezüglich des unveränderlichen Objektmusters und der Implementierung. Ich spreche nicht über die vorhandenen Klassen in der .Net-Bibliothek wie String.Warum unveränderliche Klassen in C nicht versiegelt sind #
Ich verstehe, dass unveränderliche Objekte Objekte sind, die einmal geladen von keiner externen oder internen Komponente geändert werden können. Was passiert, wenn ich die unveränderliche Klasse subsklasse, da sie keine versiegelte Klasse ist? Weisen Sie dann das Objekt der Basisklasse zu und rufen Sie eine Methode in der Basisklasse auf. Ich habe den Status der unveränderlichen Basisklasse effektiv geändert, da ihr Status das des abgeleiteten Klassenobjekts ist.
public class Person
{
private readonly string name;
public Person(string myName)
{
this.name = myName;
}
public string Name
{
get { return this.name; }
}
public void DisplayName()
{
Console.WriteLine(string.Format("Person's name is {0}", this.name));
}
}
public class AnotherPerson : Person
{
private string name1;
public AnotherPerson (string myName) : base(myName)
{
this.name1 = myName;
}
}
class Program
{
static void Main(string[] args)
{
Person me = new Prasanth("MyName");
me.DisplayName();
me = new AnotherPerson("AnotherName"); ;
me.DisplayName();
Console.ReadLine();
}
}
Ausgang:
Namen dieser Person ist MyName
Namen dieser Person ist AnotherName
Sie brauchen nicht einmal 'AnotherPerson' hier, Sie haben nur eine Referenz neu zugewiesen, das ursprüngliche Objekt wurde nicht mutiert. –
Du hast nichts mutiert. Sie haben ein anderes Objekt mit anderen Daten erstellt. –
Erstens: Unveränderlichkeit ist mehr eine "gute Praxis" als ein Sprachkonstrukt. Zweitens: Sie ordnen die Variable "mich" neu zu. Auch wenn Sie eine versiegelte Klasse verwendet haben, wären die Ergebnisse gleich. – Trauer