2013-08-08 3 views
8

У меня есть класс с именем сотрудника, который имеет поле под названием страхования, страхования типа, как этотИнициализация вложенных свойств объекта

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

У меня есть еще один класс, называемый страховой

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

В настоящее время в основной программа я хочу сделать что-то вроде

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

C# жалуется, и я знаю, как его исправить путем создания экземпляра класса страхования.

Мой вопрос может я как-то присвоить значения для полей, как я хочу сделать это в основной программе, используя как

**

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

** Я попытался

public class Employee 
    { 

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

     public String Name; 
     public Insurance Insurance; 



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

В основной метод, когда я пытаюсь

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

     } 

Я получаю это error-

Ошибка 2 Неоднозначность между 'ConsoleApplication1.Employee.Insurance' и 'ConsoleApplication1.Employee.Insurance' C: \ Users \ \ Lenovo \ документы Visual Studio 2012 \ Projects \ ConsoleApplication1 \ ConsoleApplication1 \ Program.cs 15 17 ConsoleApplication1

+0

Я хочу использовать myEmployee.Insurance.PolicyId с помощью 2 dots.Is это даже возможно в любом объектно-ориентированном LANGAUGE. –

+0

Вы определили класс «Страхование» и имущество «Страхование» как внутри Работника. Должен быть однозначно назван в классе, иначе он не будет знать, над чем работать. Сделайте страхование своим классом или переименуйте один из них. Я обновил свой ответ, чтобы отразить ваши изменения и решить эту проблему. – bland

ответ

10

Вы можете создать экземпляр страхования в конструкторе Работника так это делается автоматически. Вы можете указать его значения по умолчанию, чтобы убедиться, что они понятны, которые еще не определены как действительные при доступе позже.

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

Или держать классы вложенными:

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

без необходимости внесения изменений в ваш Employee класса, вы можете использовать инициализаторы объектов:

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

в качестве альтернативы, и, возможно, предварительно Если у вас есть класс Employee, создайте новый экземпляр Insurance либо в его конструкторе (как и в других ответах), либо еще один вариант должен сделать это в самом собственном getter , поэтому он создается только в том случае, если вы используете его , Вот пример из последнего:

class Employee 
{ 
    private Insurance insurance; 

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

Наконец, я хотел бы предложить вам не строить классы, которые имеют все открытые поля, если вы действительно не знаете, что это то, что вы хотите. Вместо этого я бы рассмотрел использование свойств над полями. Я включил предложения друга в следующий код, и при условии, мой собственный:

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

Этот * singleton-like * подход в этом случае не очень полезен. Создание экземпляра в конструкторе более чем достаточно, и он также избегает нулевой проверки каждый раз, когда пытается получить доступ к Странице. – KappaG3

+0

Было бы лучше, если бы класс страхования был тяжелым объектом. Я дам вам это. – KappaG3

+1

@ KappaG3: Я согласен на 100%, просто хотел показать другой возможный подход. –

6

Конечно, но как вы собираетесь назначить что-то, что принадлежащий к null объекта? Вам необходимо создать экземпляр Insurance в конструкторе Employee.

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

EDIT Что касается Вашего комментария: При таком подходе вы будет иметь доступ myEmplyee.Insurance.PolicyID с две точки.Конструктор внутри Класс сотрудника, поэтому вам не нужно вводить ничего, кроме того, что вы уже пытались сделать, как только вы его реализуете.

+0

Я вообще делаю это и предпочитаю его по любым другим способам. Он отлично работает для создания коллекций. – Johan

1

Вы можете написать конструктор для вашего сотрудника, который будет создать экземпляр Insurance

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

ключевое слово 'this' является избыточным, если оно не используется для методов расширения. –

+5

Это позволяет избежать путаницы, когда имя участника совпадает с его типом. – KappaG3

+2

@HighCore ключевое слово this это более выразительное, и оно полезно, когда вы пытаетесь прочитать более сложный код. особенно когда вы читаете код, который вы сами не писали –

Смежные вопросы