2012-02-11 82 views
25

我已經使用和博學多才的基類的虛擬方法,而不作爲虛擬財產

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

有人能告訴我這是什麼意思虛擬財產的任何知識?

+6

它意味着與虛擬方法相同的東西。 – 2012-02-11 08:19:03

+1

如果你知道虛擬方法,並且你知道屬性,這不是很明顯嗎? – 2012-02-11 08:20:07

+0

對我來說很奇怪,我需要更多關於爲什麼如此以及如何使用它的細節? – Mackintoast 2012-02-11 08:22:48

回答

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

平移幾乎直接到:

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

因此,虛擬關鍵字可以覆蓋的子類的屬性,就像你上面的get/set方法:

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

這是一個集合,它的實現可以在後代類中變化。

1

屬性是存取器方法的縮寫形式(獲取&集合)。這意味着虛擬關鍵字與任何其他方法具有相同的含義。這意味着你可以在派生類中重寫它。

2

屬性實際上是Getter和Setter方法的特例。因此,他們像getter和setter方法的組合,如下所示:

private string _name; 

public string GetName() 
{ 
    return _name; 
} 

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

所以virtual關鍵字是用於相同性質以及這意味着它是由子類和初始實現覆寫投放可以改變。

5

在實體框架(我相信你的例子涉及到)中,你的POCO類被創建幷包裝到一個代理類中。代理類是您聲明的類的後代,因此您的類A成爲基類。此代理類將填充數據並返回給您。這是跟蹤更改所必需的。看看這篇文章http://technet.microsoft.com/en-us/query/dd456848

我在試圖理解這一點,一些調試會話後也有類似的問題,看到了代理類和閱讀跟蹤更改其製作是弄清楚爲什麼它宣佈它是這樣的。

1

您可以擁有方法(通常),屬性,索引器或事件,virtual關鍵字具有相同的含義:修改基類項目的含義(覆蓋)。 通過屬性,您可以更改get/set訪問器。

3

在面向對象編程中,虛擬屬性是一種屬性,其行爲可以在繼承類中被覆蓋。這個概念是面向對象編程(OOP)多態部分的重要組成部分。

看看下面的例子:

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

在表示層:

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

     Console.WriteLine(instance.Name); 

     Console.ReadKey(); 

輸出將是「測試」,因爲「名稱」屬性已在派生類中被覆蓋(子類)。