在C#中,如果一个类或方法没有标记为密封的或虚拟的,它是什么?
换句话说,默认值是什么(如果没有指定)?我猜默认值是virtual,因为您可以使用“new”关键字覆盖基本方法,即使基本方法没有指定virtual。如果是这样的话,为什么我们甚至需要一个虚拟选项呢?当我们确实需要阻止进一步的继承时,我们不能只使用Sealed吗 C#方法在默认情况下是密封的——如果没有在C#中,如果一个类或方法没有标记为密封的或虚拟的,它是什么?,c#,.net,C#,.net,换句话说,默认值是什么(如果没有指定)?我猜默认值是virtual,因为您可以使用“new”关键字覆盖基本方法,即使基本方法没有指定virtual。如果是这样的话,为什么我们甚至需要一个虚拟选项呢?当我们确实需要阻止进一步的继承时,我们不能只使用Sealed吗 C#方法在默认情况下是密封的——如果没有virtual关键字,就无法覆盖它们 new关键字隐藏基类中的方法 以下是我所说的隐藏的意思: public class HidingA { public string Get()
virtual
关键字,就无法覆盖它们
new
关键字隐藏基类中的方法
以下是我所说的隐藏的意思:
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
实现
MSDN:
除非指定了
sealed
关键字,否则类将打开进行继承。new
创建一个新方法(而不是重写它),其中作为重写的方法将替换它,因此是虚拟的
。如上DanielM所述,默认情况下,方法是密封的
这就是为什么我们需要虚拟:
class Foo
{
public void Baz() { Assert("Foo.Baz"); }
}
class ChildOfFoo : Foo
{
public new void Baz() { Assert("ChildOfFoo.Baz"); }
}
Foo foo = new ChildOfFoo();
foo.Baz(); // Foo.Baz
如果未指定virtual,则新关键字会遮挡该成员,并且不再可用。相关:我想提及
new
和override
之间的区别,但这是迄今为止最准确的答案。这并不能回答有关类的问题;)非常感谢。那么类在默认情况下是虚拟的吗?在C#中没有“虚拟”类,因为不允许多重继承。未密封的类可以被子类化,类中的虚拟方法可以在子类中被重写。虚拟继承和多重继承之间有什么联系?i、 为什么虚拟在单一继承中是不相关的?这并不能回答所提出的问题。