我知道虚拟方法的用途是什么,以及如何声明它们。但我的问题是:我什么时候应该将属性声明为虚拟?
例如:
public class Base
{
public virtual string lastName { get; set; }
}
答案 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 一般来说是隐藏get
和set
方法的语法糖:
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;
}
}