59

我只使用并学习了基类的虚拟方法,而没有任何关于用作的虚拟属性的知识

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

有人能告诉我那是什么意思吗?

4

7 回答 7

71
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 { }
}
于 2012-02-11T08:35:39.490 回答
21

在面向对象编程中,虚拟属性是可以在继承类中覆盖其行为的属性。这个概念是面向对象编程 (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();

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

于 2016-08-29T05:23:19.123 回答
14

在实体框架(我相信您的示例所指)中,您的 POCO 类被创建并包装到代理类中。代理类是您声明的类的后代,因此您的类 A 成为基类。这个代理类填充了数据并返回给您。这是跟踪更改所必需的。看看这篇文章http://technet.microsoft.com/en-us/query/dd456848

我在尝试理解这一点时遇到了类似的问题,经过几次调试会话并查看代理类并阅读有关跟踪更改的信息,以弄清楚它为什么以这种方式声明。

于 2012-02-11T08:31:56.407 回答
2

属性实际上是 Getter 和 Setter 方法的特殊情况。所以它们就像 Getter 和 Setter 方法的组合,如下所示:

private string _name;

public string GetName()
{
   return _name;
}

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

因此virtual,属性的关键字也相同,这意味着它可以被子类覆盖,并且可以更改初始实现。

于 2012-02-11T08:24:57.683 回答
1

属性是访问器方法(Get & Set)的缩写形式。这意味着 virtual 关键字与任何其他方法具有相同的含义。这意味着您可以在派生类中覆盖它。

于 2012-02-11T08:24:27.873 回答
1

您可以拥有方法(通常)、属性、索引器或事件,virtual 关键字具有相同的含义:修改基类项的含义(覆盖)。使用属性,您可以更改 get/set 访问器。

于 2012-12-30T23:31:38.240 回答
0

它是一个集合,其实现可以在后代类中有所不同。

于 2012-02-11T08:23:14.260 回答