虚拟属性
我只使用和学习了基类的虚方法,而不了解所使用的虚拟属性
class A { public virtual ICollection prop{get;set;} }
有人能告诉我这是什么意思吗?
public virtual ICollection Prop { get; set; }
几乎直接翻译为:
private ICollection m_Prop; public virtual ICollection get_Prop() { return m_Prop; } public virtual void set_Prop(ICollection value) { m_Prop = value; }
因此,virtual关键字允许您覆盖子类中的属性,就像上面的get / set方法一样:
public override ICollection Prop { get { return null; } set { } }
在Entity Framework(我相信您的示例引用)中,您的POCO类被创建并包装到代理类中。 代理类是您声明的类的后代,因此您的类A成为基类。 此代理类将填充数据并返回给您。 这是跟踪变化所必需的。 看看这篇文章http://technet.microsoft.com/en-us/query/dd456848
我在尝试理解这个问题时遇到了类似的问题,经过一些调试会话后,看到代理类并阅读跟踪更改后,我们就会弄清楚它为什么被声明的方式。
在面向对象的编程中,虚拟属性是一种属性,其行为可以在inheritance类中被覆盖。 这个概念是面向对象编程(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();
输出将是“test”,因为“Name”属性已在派生类(子类)中被覆盖。
属性实际上是Getter和Setter方法的特殊情况。 所以它们就像Getter和Setter方法的组合,如下所示:
private string _name; public string GetName() { return _name; } public void SetName(string value) { this._name = value; }
因此, virtual
关键字对于属性也是相同的,这意味着它可以被子类覆盖,并且可以更改初始实现。
属性是一种缩写forms的存取方法(Get&Set)。 这意味着virtual关键字与任何其他方法具有相同的含义。 这意味着您可以在派生类中覆盖它。
您可以拥有方法(通常),属性,索引器或事件,virtual关键字具有相同的含义:修改基类项的含义(覆盖)。 使用属性,您可以更改get / set访问器。
这是一个集合,其实现可以在后代类中变化。