我们可以在c#的方法中同时使用virtual和new关键字吗?

我们可以在c#的方法中同时使用virtual和new关键字吗?,c#,function,C#,Function,我们可以在c#的方法中同时使用virtual和new关键字吗?是的。您将定义一个隐藏父级方法并允许子级重写的方法。不过,这种行为可能有点奇怪。假设您有以下课程: public class A { public void DoSomething(){ Console.WriteLine("42!"); } } public class B : A { public virtual new void DoSomething(){ Console.WriteLine("Not 42!

我们可以在c#的方法中同时使用virtual和new关键字吗?

是的。您将定义一个隐藏父级方法并允许子级重写的方法。不过,这种行为可能有点奇怪。假设您有以下课程:

public class A
{
    public void DoSomething(){ Console.WriteLine("42!"); }
}

public class B : A
{
    public virtual new void DoSomething(){ Console.WriteLine("Not 42!"); }
}

public class C : B
{
    public override void DoSomething(){ Console.WriteLine("43!"); }
}
那么,您的执行将类似于:

A a = new A();
A bAsA = new B();
A cAsA = new C();
B b = new B();
B cAsB = new C();
C c = new C();

a.DoSomething(); // 42!

b.DoSomething(); // Not 42!
bAsA.DoSomething(); // 42!

c.DoSomething(); // 43!
cAsB.DoSomething(); // 43!
cAsA.DoSomething(); // 42!

是的,你可以把两者结合起来

virtual
允许在派生类中重写方法

new
允许您隐藏旧方法


两者相辅相成,互不矛盾。

请您自己尝试一下,VisualStudio使之变得简单

class Base {
    public virtual void Method() { }
}
class Derived : Base {
    public virtual new void Method() { }
}

当您试图声明这样一个方法时发生了什么?那么,我们是否可以说“B”方法中的“new”关键字表示“仅当创建的实例是我的特定类型(B),而不是我的父类型(a)时才使用此实现?”?或者这只是巧合…@funkylusm不,它的意思是“只有在代码使用我的特定类型时才使用此实现”。注意,bAsA说42!,但实例是类型B/不同的是,它被作为类型a的东西访问。