我们可以在c#的方法中同时使用virtual和new关键字吗?
我们可以在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!
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的东西访问。