2016-07-20 25 views
-2

Mein C# -Programm muss XML-Daten empfangen und in der SQL-Datenbank speichern. Ich habe Chargen, die viele Anweisungen haben. Ich implementieren die Klassen so:C# ClassA hat viele ClassB, Zugriff auf ClassA-Instanzmethode von ClassB-Instanz

class Batch 
{ 
    public string batchUID { get; set; } 
    public Instruction[] instructionArray { get; set; } 
} 

class Instruction 
{ 
    public string instructionUID { get; set; } 
} 

Mein Programm läuft wie dies

Batch myBatch = new Batch(); 
myBatch.instructionArray = new Instruction[3]; 
myBatch.instructionArray[0] = new Instruction(); 
SomeFunc(myBatch.instructionArray[0]); 

public void SomeFunc(Instruction instruction) 
{ 
    // How do I do the following? 
    console.write(instruction.OWNER.batchUID) 
} 

Ich habe versucht, für diese ausführlich zu suchen, aber jedes Ergebnis bezieht, Innen-/Außen Klassen Vererbung, etc. Ich würde mag es vermeiden, wenn möglich innerhalb der Klassenanweisung eine BatchUID-Methode zu erstellen.

+1

'new Instruction [3]' Größe nur das Array, alle Werte werden 'null' sein, es gibt keine' Anweisung' Instanzen in dort. Sie müssen sie erstellen, und der gute Moment ist, dass Sie das Elternelement als Parameter an den Konstruktor von "Instruction" übergeben. –

+0

Sie müssen irgendwie Ihre Anweisungen festlegen. 'myBatch.instructionArray [2] = neuer Befehl {instructionUid =" foo "};' –

+0

ob ich myBatch.instructionArray [n] instanziiere oder nicht, macht keinen Unterschied zu meiner Frage ... – p4ndepravity

Antwort

0

Sie können eine Instanz von Batch an den Konstruktor übergeben und dann einen Verweis auf diese Batch speichern, die Sie mit einer Eigenschaft verfügbar machen können. (Dies wurde bereits in einer anderen Antwort gezeigt - ich wiederhole es, weil es Kontext bereitstellt, was ich neben hinzufügen.)

class Instruction 
{ 
    public Instruction(Batch parent) 
    { 
     Parent = parent; 
    } 

    public Batch Parent { get; private set; } 
    public string InstructionUID { get; set; } 
} 

Jetzt Instruction hat eine Parent Eigenschaft, die ein Batch zurückgibt.

Aber da ist eine Lücke. Wenn Sie rufen

var parent = batch.Instruction[0].Parent 

parent == batch sind? Es sieht so aus, als ob das Absicht ist. Die Instruction enthält einen Verweis auf die Batch, die es enthält.

Aber nichts setzt das durch. Zum Beispiel könnte ich dies tun:

someBatch.Instruction[0] = someOtherBatch.Instruction[1]; 

Jetzt someBatch eine Reihe von Instruction enthält, aber mindestens einer von ihnen tatsächlich someOtherBatch als seine Eltern.

Vielleicht ist diese Möglichkeit keine große Sache, aber ich denke, dass, wenn Parent zum Batch die Instruction enthält, beziehen ist gemeint, aber es könnte nicht, dann haben Sie nicht wirklich erreicht, was Sie anstreben.

Ich würde empfehlen, eine separate Klasse zu erstellen, die sowohl eine Batch als auch eine enthält. (Vielleicht ParentInstructionRelation?)

public class ParentInstructionRelation 
{ 
    Batch Parent {get;private set;} 
    Instruction Instruction {get;private set;} 

    public ParentInstructionRelation(Batch parent, Instruction instruction) 
    { 
     Parent = parent; 
     Instruction = instruction; 
    } 
} 

Auf diese Weise Instruction braucht keinen Hinweis auf ihre Eltern. Es sollte wahrscheinlich keinen Bezug zu seinem Elternteil haben. Was passiert, wenn Instruction in zwei verschiedenen Instanzen von Batch ist? Welches ist das Elternteil?

Aber wenn Batch eine Instructionund einen Verweis auf sich selbst aussetzen muss, dann kann es tun, indem Sie einen ParentInstructionRelation zurück. Oder eine Klasse, die die Instruction von Batch liest, kann diese Beziehung erstellen.

+0

Das war das, was ich gesucht habe und was ich nicht wollte, war die Erklärung, dass ich die Variable instanziieren muss. Danke Scott – p4ndepravity

0

Ihr Code hat ein Problem aufgetreten:

myBatch.instructionArray = new Instruction[3]; 

Das ist nur mit 3 null Werten ein Array erstellen, nicht mehr als 3 Instanzen von Instruction. Dies liegt daran, dass class ein Referenztyp ist und nicht automatisch instanziiert wird (struct s sind jedoch, da sie Werttypen sind und alle Werte in einem Standardkonstruktor initialisiert werden, der dann aufgerufen wird). Sie müssen diese Anweisungen immer noch erstellen, bevor Sie sie an Ihre Methode übergeben, da Sie praktisch nur null übergeben würden.

Dann, wenn eine Instanz von Instruction erstellen, nur die Eltern als Parameter übergeben, und es in der Klasse erinnern, wie folgt aus:

class Instruction 
{ 
    public Instruction(Batch parent) 
    { 
     Parent = parent; 
    } 

    public Batch Parent { get; private set; } 
    public string InstructionUID { get; set; } // Please start properties with an uppercase letter 
} 

Auf diese Weise können Sie die Batch Instanz zugreifen, auf die die Instruction Instanz gehört später dazu.

Batch myBatch = new Batch(); 
myBatch.InstructionArray = new Instruction[3]; 
// TODO: Create the instances here, the array is just null null null now! 
myBatch.InstructionArray[0] = new Instance(myBatch); // example 
SomeFunc(myBatch.InstructionArray[0]); 

public void SomeFunc(Instruction instruction) 
{ 
    Console.Write(instruction.Parent.BatchUID) 
} 

Wenn dies ein gutes Design ist ein andere Frage ist, könnte die Instruction haben die SomeFunc Sachen in mich selbst, aber ich bin ich nicht sicher, was das Projekt schließlich erreichen sollte.