2012-02-11 32 views
25

Tôi đã sử dụng và chỉ biết phương pháp ảo của lớp cơ sở mà không cần bất kỳ kiến ​​thức về tính chất ảo sử dụng nhưtài sản ảo

class A 
{ 
    public virtual ICollection<B> prop{get;set;} 
} 

Có thể ai đó cho tôi biết điều đó có nghĩa?

+6

Điều đó có nghĩa giống như phương pháp ảo. –

+1

Nếu bạn biết các phương pháp ảo, và bạn biết các thuộc tính, không phải là điều này khá tự giải thích? –

+0

Thật lạ lùng với tôi, tôi cần biết thêm chi tiết về lý do tại sao nó được sử dụng như thế nào? – Mackintoast

Trả lời

35
public virtual ICollection<B> Prop { get; set; } 

: dịch gần như trực tiếp đến:

private ICollection<B> m_Prop; 

public virtual ICollection<B> get_Prop() 
{ 
    return m_Prop; 
} 

public virtual void set_Prop(ICollection<B> value) 
{ 
    m_Prop = value; 
} 

Như vậy, từ khóa ảo cho phép bạn ghi đè lên các tài sản tại các lớp học cũng giống như bạn mong các get/set phương pháp trên:

public override ICollection<B> Prop 
{ 
    get { return null; } 
    set { } 
} 
0

Đó là một bộ sưu tập mà triển khai có thể khác nhau trong lớp con cháu.

1

Thuộc tính là dạng rút gọn của phương thức truy cập (Get & Set). Điều đó có nghĩa là từ khóa ảo có ý nghĩa giống với bất kỳ phương pháp nào khác. Điều đó có nghĩa là bạn có thể ghi đè lên nó trong các lớp dẫn xuất.

2

Thuộc tính thực sự là trường hợp đặc biệt của phương pháp Getter và Setter. Vì vậy, họ cũng giống như sự kết hợp của Getter và Setter phương pháp như hình dưới đây:

private string _name; 

public string GetName() 
{ 
    return _name; 
} 

public void SetName(string value) 
{ 
    this._name = value; 
} 

Vì vậy virtual từ khóa là giống nhau đối với tài sản cũng có nghĩa là nó là ghi đè bởi các lớp học trẻ em và thực hiện ban đầu có thể được thay đổi.

5

Trong khung thực thể (mà tôi tin rằng ví dụ của bạn đề cập đến), các lớp POCO của bạn được tạo và được bao bọc thành lớp proxy. Lớp proxy là một hậu duệ của lớp mà bạn khai báo, vì vậy lớp A của bạn sẽ trở thành một lớp cơ sở. Lớp proxy này được điền dữ liệu và trả lại cho bạn. Điều này là cần thiết để theo dõi các thay đổi. Hãy xem bài viết này http://technet.microsoft.com/en-us/query/dd456848

Tôi đã gặp sự cố tương tự khi cố gắng hiểu điều này và sau một vài phiên gỡ lỗi và xem các lớp proxy và đọc về các thay đổi theo dõi nó được hiểu tại sao nó được khai báo theo cách .

1

Bạn có thể có các phương thức (thường), thuộc tính, chỉ mục hoặc sự kiện, từ khóa ảo có ý nghĩa tương tự: sửa đổi ý nghĩa (ghi đè) của hạng mục cơ sở. Với các thuộc tính, bạn có thể thay đổi các trình truy cập get/set.

3

Trong lập trình hướng đối tượng, thuộc tính ảo là thuộc tính có hành vi có thể bị ghi đè trong lớp kế thừa. Khái niệm này là một phần quan trọng của phần đa hình của lập trình hướng đối tượng (OOP).

nhìn vào ví dụ dưới đây:

public class BaseClass 
{ 

    public int Id { get; set; } 
    public virtual string Name { get; set; } 

} 

public class DerivedClass : BaseClass 
{ 
    public override string Name 
    { 
     get 
     { 
      return base.Name; 
     } 

     set 
     { 
      base.Name = "test"; 
     } 
    } 
} 

ở cấp trình bày:

 DerivedClass instance = new DerivedClass() { Id = 2, Name = "behnoud" }; 

     Console.WriteLine(instance.Name); 

     Console.ReadKey(); 

đầu ra sẽ là "thử nghiệm" vì "Tên" bất động sản đã được ghi đè trong lớp có nguồn gốc (lớp phụ).

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