2012-02-11 84 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(); 

输出将是“测试”,因为“名称”属性已在派生类中被覆盖(子类)。