Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中,如果一个类或方法没有标记为密封的或虚拟的,它是什么?_C#_.net - Fatal编程技术网

在C#中,如果一个类或方法没有标记为密封的或虚拟的,它是什么?

在C#中,如果一个类或方法没有标记为密封的或虚拟的,它是什么?,c#,.net,C#,.net,换句话说,默认值是什么(如果没有指定)?我猜默认值是virtual,因为您可以使用“new”关键字覆盖基本方法,即使基本方法没有指定virtual。如果是这样的话,为什么我们甚至需要一个虚拟选项呢?当我们确实需要阻止进一步的继承时,我们不能只使用Sealed吗 C#方法在默认情况下是密封的——如果没有virtual关键字,就无法覆盖它们 new关键字隐藏基类中的方法 以下是我所说的隐藏的意思: public class HidingA { public string Get()

换句话说,默认值是什么(如果没有指定)?我猜默认值是virtual,因为您可以使用“new”关键字覆盖基本方法,即使基本方法没有指定virtual。如果是这样的话,为什么我们甚至需要一个虚拟选项呢?当我们确实需要阻止进一步的继承时,我们不能只使用Sealed吗

C#方法在默认情况下是密封的——如果没有
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、 为什么虚拟在单一继承中是不相关的?这并不能回答所提出的问题。