2016-10-16 1 views
0

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

+3

Sie brauchen nicht einmal 'AnotherPerson' hier, Sie haben nur eine Referenz neu zugewiesen, das ursprüngliche Objekt wurde nicht mutiert. –

+1

Du hast nichts mutiert. Sie haben ein anderes Objekt mit anderen Daten erstellt. –

+0

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

Antwort

0

Sie nur readonly string name einmal zuweisen. Ich bin mir momentan nicht sicher ob das nur im Konstruktor möglich ist.

Sie ordnen es im ersten Lauf "MyName" und im zweiten Lauf Sie "AnotherName" auf ein komplett anderes Objekt assing, die Sie erstellt mit new AnotherPerson(...)

static void Main(string[] args) 
{ 
    Person me = new Prasanth("MyName"); 
    me.DisplayName(); 
    // vvvvvv here you lose the reference to the old object 
    me = new AnotherPerson("AnotherName"); ; 
    me.DisplayName(); 
    Console.ReadLine(); 
} 
+0

Danke für die Antwort, ich habe darüber nachgedacht, weil ich gelesen habe, dass unveränderliche Klassen zum Speichern der Konfiguration verwendet werden können Daten (web.config/app, config). Normalerweise verwende ich zu diesem Zweck statische Felder und frage mich, wie ich in diesem Szenario unveränderliche Objekte anwenden könnte. Im Falle von Konfigurationsdaten sollte ich es nicht einmal von irgendjemandem modifizieren lassen, es wird einmal aus der Konfiguration gelesen und das ist es. Also glaube ich, dass mein Verständnis falsch war und in meinem Szenario kann ich das unveränderliche Objektmuster nicht anwenden, wie in allen Tutorials beschrieben. – Prasanth

5

Lassen Sie uns über die Mängel Ihres Beispiel vergessen (die Kommentare schon gesagt, alles und beantworte deine Frage: "Warum sind unveränderliche Klassen nicht in C# eingeschlossen?"

Die Sache ist, Unveränderlichkeit ist kein Merkmal der C# -Sprache. Einige Sprachen unterstützen Unveränderlichkeit als Feature (in diesem Fall wäre Ihr Punkt gültig), aber C# nicht. Am Ende sind Sie nur Aufbau einer unveränderlichen Klasse aus bestehenden, Allzweck-Funktionen. Daher können Einschränkungen auftreten.

Auch Unveränderlichkeit ist eine Vorsichtsmaßnahme, kein Schutz. Es geht darum, niemanden zu veranlassen, die Daten durch "normale" Mittel zu ändern. Wenn jemand wirklich die Daten ändern möchte, können sie das immer tun, zum Beispiel durch Reflektion (oder Sub-Classing, wie du erwähnt hast). Aber wenn ein Entwickler das tut, ignoriert er nicht, dass er Daten verändert, die nur gelesen werden dürfen, und wir können annehmen, dass er dafür einen guten Grund hat. Der Punkt der Unveränderlichkeit besteht darin, zu verhindern, dass der Entwickler sich unwissentlich in den Fuß schießt und ihn nicht absperrt.

+0

Danke für die Antwort. – Prasanth

Verwandte Themen