2013-08-08 18 views
8

ho una classe denominata dipendente che ha un campo chiamato assicurazione che è di assicurazione tipo come questoInizializzazione proprietà degli oggetti nidificati

public class Employee 
{ 
    public string Name; 
    public Insurance Insurance; 
} 

Ho un'altra classe chiamata assicurazione

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

Ora, nel principale programma voglio fare qualcosa come

var myEmployee = new Employee(); 
myEmployee.Name = "Jhon"; 
myEmployee.Insurance.PolicyId = 123 ; 
myEmployee.Insurance.PolicyName = "Life Time" ; 

C# si lamenta e so come risolverlo creando un'istanza della classe Assicurazione.

La mia domanda è posso in qualche modo assegnare i valori per i campi nel modo in cui voglio farlo nel programma principale utilizzando come

**

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

** ho provato

public class Employee 
    { 

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

     public String Name; 
     public Insurance Insurance; 



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

Nel metodo principale quando provo

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

     } 

ottengo questo Error-

errore 2 ambiguità tra 'ConsoleApplication1.Employee.Insurance' e 'ConsoleApplication1.Employee.Insurance' C: \ Users \ Lenovo \ Documenti \ Visual Studio 2012 \ Projects \ ConsoleApplication1 \ ConsoleApplication1 \ Program.cs 15 17 ConsoleApplication1

+0

voglio usare myEmployee.Insurance.PolicyId utilizzando 2 dots.Is questo ancora possibili in qualsiasi orientato agli oggetti langauge. –

+0

Hai definito una classe "Assicurazione" e una proprietà "Assicurazione" sia all'interno del Dipendente. Deve essere nominato in modo univoco all'interno della classe, altrimenti non saprà a chi lavorare. Assicurati che sia di classe, o rinomina uno di loro. Ho aggiornato la mia risposta per riflettere le tue modifiche e risolvere il problema. – bland

risposta

10

è possibile creare un'istanza di assicurazione nel costruttore del dipendente in modo che viene fatto automaticamente per voi. È possibile fornire valori predefiniti per assicurarsi che sia compreso che non è ancora stato definito valido per l'accesso in seguito.

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; } 
} 

o per mantenere le classi annidate:

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

senza richiedere modifiche al tuo classe Employee, è possibile utilizzare inizializzatori oggetto:

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

In alternativa, e forse pre è possibile che la classe Employee crei una nuova istanza di Insurance nel suo costruttore (come nelle altre risposte), oppure un'altra opzione sarebbe eseguirla nel getter proprietà Insurance stesso, quindi viene istanziata solo se la si utilizza . Ecco un esempio di quest'ultimo:

class Employee 
{ 
    private Insurance insurance; 

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

Infine, vorrei suggerire che non costruire classi che hanno tutti i campi pubblici a meno che tu non sappia che è quello che vuoi. Invece, vorrei prendere in considerazione l'utilizzo di proprietà sui campi. Ho incorporato di altri suggerimenti nel codice seguente, e ha fornito la mia:

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

L'approccio * singleton-like * non sembra molto utile in questo caso. L'istanziazione nel costruttore è più che sufficiente ed evita anche un controllo nullo ogni volta che l'assicurazione sta tentando di accedere. – KappaG3

+0

Sarebbe meglio se la classe di assicurazione fosse un oggetto pesante, però. Ti darò questo. – KappaG3

+1

@ KappaG3: Sono d'accordo al 100%, volevo solo mostrare un altro approccio possibile. –

6

Certo, ma come hai intenzione di assegnare qualcosa che è l'appartenenza a un oggetto null? È necessario creare un'istanza di Insurance nel costruttore Employee.

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

EDIT Per quanto riguarda il tuo commento: Seguendo questo approccio si sarà in grado di accedere myEmplyee.Insurance.PolicyID con due puntini.Il costruttore è all'interno della classe del dipendente, quindi non dovrai digitare nulla di più di quello che hai già provato a fare, una volta implementato.

+0

Generalmente lo faccio e lo preferisco in qualsiasi altro modo. Funziona benissimo per creare istanze di raccolte. – Johan

1

È possibile scrivere un costruttore per il vostro dipendente che istanziare Insurance

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

La parola chiave 'this' è ridondante a meno che non venga utilizzata per i metodi di estensione. –

+5

Evita la confusione quando il nome del membro è uguale al suo tipo. – KappaG3

+2

@HighCore la parola chiave 'this' è più espressiva ed è utile quando stai cercando di leggere codice più complesso. specialmente quando stai leggendo il codice che tu stesso non hai scritto –

Problemi correlati