2013-08-08 18 views
8

Ich habe eine Klasse namens Mitarbeiter, die ein Feld namens Versicherung hat, die wie dieseInitialisierung verschachtelte Objekteigenschaften

vom Typ Versicherung ist
public class Employee 
{ 
    public string Name; 
    public Insurance Insurance; 
} 

habe ich eine andere Klasse namens Insurance

public class Insurance 
{ 
    public int PolicyId; 
    public String PolicyName; 
} 

Jetzt im Haupt Programm Ich möchte etwas tun wie

C# beschweren sich und ich weiß, wie es zu beheben ist indem Sie eine Instanz der Insurance-Klasse erstellen.

Meine Frage ist, kann ich irgendwie die Werte für die Felder in der Art und Weise zuweisen ich es im Hauptprogramm tun möchten, mit wie

**

myEmployee.Insurance.PolicyId = 123 ; 
myEmployee.Insurance.PolicyName = "Life Time" ; 

** Ich versuchte

public class Employee 
    { 

     public Employee() 
     { 
      Insurance Insurance = new Insurance(); 
     } 

     public String Name; 
     public Insurance Insurance; 



     public class Insurance 
     { 
      public int PolicyId; 
      public String PolicyName; 
     } 
    } 

im Hauptverfahren, wenn ich versuche

class Program 
    { 
     static void Main(string[] args) 
     { 
      var joe = new Employee(); 
      joe.Name = "Joe"; 
      joe.Insurance. 

     } 

ich dieses

Fehler 2 Mehrdeutigkeit zwischen 'ConsoleApplication1.Employee.Insurance' fehler- und 'ConsoleApplication1.Employee.Insurance' c: \ users \ lenovo \ Dokumente \ Visual Studio 2012 \ Projects \ ConsoleApplication1 \ ConsoleApplication1 \ Program.cs 15 17 ConsoleApplication1

+0

Ich möchte myEmployee.Insurance.PolicyId mit 2 dots.Is dies sogar möglich, in jedem objektorientierten Langauge verwenden. –

+0

Sie haben eine Klasse "Versicherung" und eine Eigenschaft "Versicherung" innerhalb von Mitarbeiter definiert. Muss in der Klasse eindeutig benannt werden, sonst weiß es nicht, an welcher Stelle gearbeitet werden soll. Stellen Sie sicher, dass es sich um eine eigene Klasse handelt, oder benennen Sie eine von ihnen um. Ich habe meine Antwort aktualisiert, um Ihre Änderungen zu berücksichtigen und das Problem zu beheben. – bland

Antwort

10

instanziiert wird Insurance in Mitarbeiter-Konstruktor instanziiert könnte, so dass es für Sie automatisch erfolgt. Sie können die Standardwerte angeben, um sicherzustellen, dass bei späteren Zugriffen noch keine gültige Definition vorliegt.

public class Employee 
{ 
    Insurance Insurance { get; set; } 

    public Employee() 
    { 
     this.Insurance = new Insurance() { PolicyId = -1 }; 
    } 
} 

public class Insurance 
{ 
    public int PolicyId { get; set; } 
    public string PolicyName { get; set; } 
} 

Oder die Klassen verschachtelt zu halten:

public class Employee 
{ 
    Insurance InsurancePolicy { get; set; } 

    public Employee() 
    { 
     this.InsurancePolicy = new Insurance() { PolicyId = -1 }; 
    } 
    public class Insurance 
    { 
     public int PolicyId { get; set; } 
     public string PolicyName { get; set; } 
    } 
} 
10

Ohne Änderungen an Ihrer Employee Klasse zu erfordern, könnten Sie Objektinitialisierer verwenden:

var myEmployee = new Employee 
{ 
    Name = "Jhon", 
    Insurance = new Insurance 
    { 
     PolicyId = 123, 
     PolicyName = "Life Time" 
    } 
}; 

Alternativ und vielleicht vor Die Klasse Employee kann entweder in ihrem Konstruktor (wie in den anderen Antworten) eine neue Instanz von Insurance erstellen, oder eine andere Möglichkeit wäre, sie im Eigenschaftsgetter Insurance selbst auszuführen, sodass sie nur instanziiert wird, wenn Sie sie verwenden . Hier ist ein Beispiel für letzteres:

class Employee 
{ 
    private Insurance insurance; 

    public Insurance Insurance 
    { 
     get 
     { 
      if (insurance == null) 
      { 
       insurance = new Insurance(); 
      } 
      return insurance; 
     } 
    } 
} 

Schließlich würde ich vorschlagen, dass Sie nicht Klassen erstellen, die alle öffentlichen Felder haben, wenn Sie wirklich wissen, dass das, was Sie wollen. Stattdessen würde ich die Verwendung von Eigenschaften über Felder in Betracht ziehen. Ich habe andere Vorschläge in den folgenden Code eingebaut, und zur Verfügung gestellt meine eigene:

public class Employee 
{ 
    public Employee() 
    { 
     this.Insurance = new Insurance(); 
    } 

    // Perhaps another constructor for the name? 
    public Employee(string name) 
     : this() 
    { 
     this.Name = name; 
    } 

    public string Name { get; set; } 
    public Insurance Insurance { get; private set; } 
} 

public class Insurance 
{ 
    public int PolicyId { get; set; } 
    public string PolicyName { get; set; } 
} 
+0

Dieser Ansatz * singleton-like * klingt in diesem Fall nicht sehr nützlich. Die Instanziierung im Konstruktor ist mehr als genug, und es vermeidet auch jedes Mal einen Null-Check, wenn Insurance versucht wird, darauf zuzugreifen. – KappaG3

+0

Es wäre besser, wenn die Insurance-Klasse ein schweres Objekt wäre. Ich werde dir das geben. – KappaG3

+1

@ KappaG3: Ich stimme 100% zu, wollte nur einen anderen möglichen Ansatz zeigen. –

6

Natürlich, aber wie wollen Sie etwas zuweisen, die zu einem null Objekt gehört? Sie müssen Insurance in Employee Konstruktor instanziieren.

public Employee() 
{ 
    this.Insurance = new Insurance(); 
} 

EDIT Ihren Kommentar Betreff: diesem Ansatz folgend Sie wird der Lage sein, den Zugriff auf myEmplyee.Insurance.PolicyID mit zwei Punkte.Der Konstruktor ist innerhalb Employees Klasse, so dass Sie nicht mehr als das eingeben müssen, was Sie bereits versucht haben, sobald Sie es implementieren.

+0

Ich mache das generell und bevorzuge es auf andere Weise. Es eignet sich hervorragend zum Instanziieren von Sammlungen. – Johan

1

Sie können einen Konstruktor für Ihre Mitarbeiter schreiben, die Insurance

public class Employee 
{ 
    public Employee() 
    { 
     this.Insurance = new Insurance(); 
    } 
    public string Name; 
    public Insurance Insurance; 
} 
+1

'this' Schlüsselwort ist redundant, wenn es nicht für Erweiterungsmethoden verwendet wird. –

+5

Es vermeidet Verwirrung, wenn der Name des Mitglieds mit seinem Typ identisch ist. – KappaG3

+2

@HighCore Das Schlüsselwort 'this' ist aussagekräftiger und nützlich, wenn Sie versuchen, komplexeren Code zu lesen. vor allem, wenn Sie Code lesen, den Sie selbst nicht geschrieben haben –

Verwandte Themen