2013-08-08 48 views
8

Tôi có một lớp được gọi là nhân viên trong đó có một lĩnh vực được gọi là bảo hiểm là bảo hiểm kiểu như thế nàyKhởi tạo thuộc tính đối tượng lồng nhau

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

Tôi có một lớp được gọi là Bảo hiểm

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

Bây giờ trong chính chương trình tôi muốn làm điều gì đó như

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

C# đang khiếu nại và tôi biết cách khắc phục bằng cách tạo một thể hiện của lớp Bảo hiểm.

Câu hỏi của tôi là tôi có thể bằng cách nào đó gán các giá trị cho các lĩnh vực trong cách tôi muốn làm điều đó trong chương trình chính sử dụng như

**

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

** tôi đã cố gắng

public class Employee 
    { 

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

     public String Name; 
     public Insurance Insurance; 



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

Trong phương pháp chính khi tôi thử

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

     } 

tôi có được điều này sai sót

Lỗi 2 sự nhập nhằng giữa 'ConsoleApplication1.Employee.Insurance' và 'ConsoleApplication1.Employee.Insurance' C: \ Users \ lenovo \ Documents \ Visual Studio 2012 \ Projects \ ConsoleApplication1 \ ConsoleApplication1 \ Program.cs 15 17 ConsoleApplication1

+0

Tôi muốn sử dụng myEmployee.Insurance.PolicyId sử dụng 2 dots.Is này thậm chí có thể ở bất kỳ langauge hướng đối tượng. –

+0

Bạn đã xác định lớp "Bảo hiểm" và thuộc tính "Bảo hiểm" cả trong Nhân viên. Phải được đặt tên duy nhất trong lớp, nếu không nó sẽ không biết phải làm gì. Bảo hiểm là lớp riêng hoặc đổi tên một trong số đó. Tôi đã cập nhật câu trả lời của mình để phản ánh chỉnh sửa của bạn và giải quyết vấn đề này. – bland

Trả lời

10

Bạn có thể nhanh chóng bảo hiểm trong constructor của nhân viên vì vậy nó được thực hiện tự động cho bạn. Bạn có thể cung cấp các giá trị mặc định để đảm bảo nó được hiểu là chưa được xác định là hợp lệ khi được truy cập sau này.

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

Hoặc để giữ cho lớp lồng nhau:

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

Nếu không có yêu cầu thay đổi lớp Employee của bạn, bạn có thể sử dụng initializers đối tượng:

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

Ngoài ra, và có lẽ trước ferably, bạn có thể có một lớp Employee tạo ra một thể hiện mới Insurance hoặc trong hàm khởi tạo của nó (như trong các câu trả lời khác), hoặc một tùy chọn khác sẽ làm điều đó trong thuộc tính getter Insurance, vì vậy nó được khởi tạo chỉ khi bạn sử dụng nó . Dưới đây là ví dụ về trường hợp sau:

class Employee 
{ 
    private Insurance insurance; 

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

Cuối cùng, tôi khuyên bạn không nên tạo các lớp có tất cả các trường công khai trừ khi bạn thực sự biết đó là những gì bạn muốn. Thay vào đó, tôi sẽ xem xét sử dụng các thuộc tính trên các trường. Tôi đã đưa lời đề nghị của người khác vào đoạn mã sau, và được cung cấp riêng tôi:

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

Cách tiếp cận * singleton-like * đó không có vẻ hữu ích trong trường hợp này. Instantiating trong constructor là quá đủ, và nó cũng tránh được việc kiểm tra null mỗi khi bảo hiểm đang cố gắng truy cập. – KappaG3

+0

Sẽ tốt hơn nếu lớp Bảo hiểm là một vật nặng. Tôi se đưa bạn cai đo. – KappaG3

+1

@ KappaG3: Tôi đồng ý 100%, chỉ muốn hiển thị một cách tiếp cận có thể có khác. –

6

Tất nhiên, nhưng làm thế nào thì bạn sẽ gán cái gì đó là thuộc về một đối tượng null? Bạn cần phải khởi tạo Insurance trong hàm tạo của Employee.

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

EDIT Về nhận xét của bạn: Tiếp theo phương pháp này bạn sẽ có thể truy cập myEmplyee.Insurance.PolicyID với hai chấm.Hàm dựng là bên trong lớp của nhân viên, do đó bạn sẽ không phải nhập bất cứ điều gì nhiều hơn những gì bạn đã cố gắng làm, khi bạn triển khai nó.

+0

Tôi thường làm điều này và thích nó hơn bất kỳ cách nào khác. Nó hoạt động rất tốt cho việc tạo các bộ sưu tập. – Johan

1

Bạn có thể viết một constructor cho nhân viên của bạn sẽ nhanh chóng Insurance

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

Từ khóa 'this' này không cần thiết trừ khi được sử dụng cho các phương pháp mở rộng. –

+5

Nó tránh nhầm lẫn khi tên của thành viên giống như tên của nó. – KappaG3

+2

@Chi tiết từ khóa 'this' này mang tính biểu cảm hơn và hữu ích khi bạn đang cố gắng đọc mã phức tạp hơn. đặc biệt là khi bạn đang đọc mã mà bản thân bạn không viết –

Các vấn đề liên quan