何时在课堂上使用虚拟数据成员?

时间:2016-06-02 12:12:52

标签: c#

我知道虚拟方法的用途是什么,以及如何声明它们。但我的问题是:我什么时候应该将属性声明为虚拟?

例如:

public class Base
{
    public virtual string lastName { get; set; }
}

2 个答案:

答案 0 :(得分:1)

正如此问题下面的评论所述,数据成员实际上是方法,因此您可以将它们声明为虚拟

使用属性,您可以稍后添加一些验证,或实现事件,例如,当您实现 INotifyPropertyChange 接口时。

来自MSDN的代码:

class MyBaseClass
{
  public virtual string Name { get; set; }
}


class MyDerivedClass : MyBaseClass
{
  private string name;

 // Override auto-implemented property with ordinary property
 // to provide specialized accessor behavior.
  public override string Name
  {
      get
      {
          return name;
      }
      set
      {
          if (value != String.Empty)
          {
              name = value;
          }
          else
          {
              name = "Unknown";
          }
      }
  }

}

答案 1 :(得分:0)

规则是相同的,因为 property 一般来说是隐藏getset方法的语法糖:

  public class Base {
    public virtual string LastName {
      get; // this is method (.Net implements it for you)
      set; // this is method (.Net implements it for you)
    }
  }

想象

  Base b = ...
  ...
  b.LastName = b.LastName + "x";

并与没有属性的Java进行比较:

  b.setLastName(b.getLastName() + "x");

对于问题中的课程,您可能想要这样的内容:

  public class Derived: Base {  
    public override string LastName {
      get {
        return String.IsNullOrEmpty(base.LastName)
          ? base.LastName
          : base.LastName.ToUpper(); 
      } 
      set {   
        if (null == value)
          throw new ArgumentNullException("value")

        base.LastName = value;
      }
    }