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