2016-06-05 11 views
0

Es scheint seltsam, dass Sie eine Klasse definieren können, die ein Member-Feld dieser Klasse hat.Definieren einer Klasse mit einem Feld der gleichen Klasse. Klasse mit Selbstreferenzen?

public class Person 
{ 
    public string Name { get; set; } 
    public Person Spouse { get; set; } 
} 

Nun, wenn ich nennen diese Klasse:

var jane = new Person(); 
var jim = new Person(); 
jane.Spouse = jim; 
jim.Spouse.Spouse = jane; 

Die letzte Zeile einen Fehler verursacht. Aber ich habe ein paar Probleme damit, zu zeigen, was der jim.Spouse.Spouse-Aufruf macht. Es sollte zuerst jim.spouse evaluieren, was null ist, so dass es einen Fehler verursacht, oder? Wenn ich zuerst jim.spouse = jane anmelde, sollte es funktionieren? Aber dann sage ich im Wesentlichen jane.spouse = jane.

Wenn eine Klasse ein Feld des gleichen Typs hat, was macht sie dann mit der Klasse? Ist es nur möglich, dass zwei Instanzen der Klasse eine Beziehung haben? Die Klasse referenziert sich selbst, so dass sie von sich selbst erbt? Ich bin irgendwie verwirrt und frage mich auch, ob das eine schlechte Übung ist.

+0

Wenn die Antwort funktioniert, sollten Sie auf das Häkchen klicken, um dies anzuzeigen. Da Sie dies noch nicht getan haben, nehmen Sie bitte die [Tour], um einige Details zur Funktionsweise von SO zu sehen. Akzeptierte und aktualisierte Antworten helfen anderen, gute Antworten zu finden – Plutonix

Antwort

4

Sie haben hier einige Dinge gefragt, aber im Allgemeinen ist es in Ordnung, einen Verweis auf denselben Typ (sogar die gleiche Instanz) für ein Objekt zu haben.

public class Thing { 
    private string name; 

    public Thing(string name) { 
     this.name = name; 
    } 
    public Thing Other { 
     get; 
     set; 
    } 

    public override string ToString() { 
     return this.name; 
    } 
} 

var o = new Thing("Foo"); 
o.Other = o; 
Debug.WriteLine(o.Other.Other.Other.Other.ToString()); // Could go on forever 
  1. Sie sind richtig in Ihre Behauptung über die Ausnahme. Es wird ausgelöst, weil jim.Spouse eine Nullreferenz ist, daher können Sie keine Eigenschaft festlegen.
  2. Wenn Sie jim.Spouse = jane; festlegen, sollten Sie in der Lage sein, eine Referenz festzulegen. In diesem Fall möchten Sie jim.Spouse.Spouse = jim; sagen, da jim.Spousejane auswertet.
  3. In Bezug auf die Felder des gleichen Typs ist es nicht anders als alles andere. Es ist nur eine Variable mit einem Typ, den die Klasse verwendet. Es ist kein ungewöhnliches Muster für einen Typ, einen Verweis auf etwas anderes desselben Typs zu haben. Zum Beispiel könnte eine Mitarbeiterklasse einen Verweis auf einen Manager haben, der auch ein Mitarbeiter ist. Ein anderes häufiges Beispiel sind Baumimplementierungen, in einem Binärbaum hat ein Knoten einen Verweis auf einen linken/rechten Kindknoten.
Verwandte Themen