虚方法就一定带有virual(Overridable)吗?
上接http://www.2cto.com/kf/201203/123025.html
class B:A
{
public override void Say()
{
Console.WriteLine("B:Say method is an virual method:"+MethodBase.GetCurrentMethod().IsVirtual);
}
}
class C:B
{
public override void Say()
{
Console.WriteLine("C:Say method is an virual method:"+MethodBase.GetCurrentMethod().IsVirtual);
}
}
class Program
{
static void Main(string[] args)
{
B b = new B();
b.Say();
C c = new C();
c.Say();
}
}
}
[VB.NET]
Namespace MyTest
Class A
Public Overridable Sub Say()
Console.WriteLine("A")
End Sub
End Class
Class B
Inherits A
Public Overrides Sub Say()
Console.WriteLine("B:Say method is an virual method:" + MethodBase.GetCurrentMethod().IsVirtual)
End Sub
End Class
Class C
Inherits B
Public Overrides Sub Say()
Console.WriteLine("C:Say method is an virual method:" + MethodBase.GetCurrentMethod().IsVirtual)
End Sub
End Class
Class Program
Private Shared Sub Main(args As String())
Dim b As New B()
b.Say()
Dim c As New C()
c.Say()
End Sub
End Class
End Namespace
MethodBase是一个内置的方法,位于System.Reflection命名空间下,用于检测当前方法(不仅是“方法”,还可以是属性、构造函数等)一些属性,其中IsVirtual就是检测是否是“虚方法”,结果的确是!看来不能“以貌取人”啊!
附带说一句:如果强制某个重写方法变得不再“虚”,就使用Sealed(VB.NET中是NotOverridable),就像为整个类做“绝育手术”一样(C#是sealed,VB.NET是NotInheritable),给你的方法做“绝育手术”吧,不过这貌似后话了……:-)
摘自 Serviceboy