换句话说,默认值是什么(如果没有指定)?我猜默认是虚拟的,因为即使基本方法没有指定虚拟,您也可以使用“new”关键字来覆盖基本方法。如果是这样的话,那么为什么我们还需要虚拟选项呢?当我们确实需要防止进一步继承时,我们难道不能只使用 Sealed 吗?
C# 方法默认是密封的——如果没有virtual
关键词。
The new
关键词hides基类中的方法。
这就是我所说的隐藏的意思:
public class HidingA
{
public string Get()
{
return "A";
}
}
public class HidingB : HidingA
{
public new string Get()
{
return "B";
}
}
HidingA a = new HidingA();
HidingB b = new HidingB();
Console.WriteLine(a.Get()); // "A"
Console.WriteLine(b.Get()); // "B"
HidingA c = new HidingB();
Console.WriteLine(c.Get()); // "A". Since we're calling this instance of "B" an "A",
//we're using the "A" implementation.
现在,虚拟版本!
public class VirtualA
{
public virtual string Get()
{
return "A";
}
}
public class VirtualB : VirtualA
{
public override string Get()
{
return "B";
}
}
VirtualA a = new VirtualA();
VirtualB b = new VirtualB();
Console.WriteLine(a.Get()); // "A"
Console.WriteLine(b.Get()); // "B"
VirtualA c = new VirtualB();
Console.WriteLine(c.Get()); // "B". We overrode VirtualB.Get, so it's using the
// "B" implementation of the method
所以如果我们创建一个方法HidingA
作为参数并传递给它一个实例HidingB
,我们将得到HidingA
的实施Get
method.
MSDN: http://msdn.microsoft.com/en-us/library/6fawty39.aspx http://msdn.microsoft.com/en-us/library/6fawty39.aspx
类对于继承是开放的,除非sealed
指定了关键字。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)