说我有一个接口和两个类,其中一个类实现了此接口:
interface IAAA
{
int F1 { get; set; }
}
class AAA1
{
public int F1 { get; set; }
public int F2 { get; set; }
}
class AAA2 : IAAA
{
public int F1 { get; set; }
public int F2 { get; set; }
}
在类AAA2
中,属性F1
是从接口IAAA
'继承'的(我不确定),然后我使用反射来检查属性是否是虚拟的:>
Console.WriteLine("AAA1 which does not implement IAAA");
foreach (var prop in typeof(AAA1).GetProperties())
{
var virtualOrNot = prop.GetGetMethod().IsVirtual ? "" : " not";
Console.WriteLine($@"{prop.Name} is{virtualOrNot} virtual");
}
Console.WriteLine("AAA2 which implements IAAA");
foreach (var prop in typeof(AAA2).GetProperties())
{
var virtualOrNot = prop.GetGetMethod().IsVirtual ? "" : " not";
Console.WriteLine($"{prop.Name} is{virtualOrNot} virtual");
}
输出为:
AAA1 which does not implement IAAA
F1 is not virtual
F2 is not virtual
AAA2 which implements IAAA
F1 is virtual
F2 is not virtual
任何原因吗?
答案 0 :(得分:34)
虚拟成员可以引用类中的实例数据,并且必须通过该类的实例进行引用。公共语言运行时要求所有实现接口成员的方法都必须标记为虚拟;因此,编译器将方法
标记为thereisflight(X,Y,D) :- flight(X,Y,D). flightR(A,B,FlightRoute,Distance) :- travel(A,B,[A],Q,Distance), reverse(Q,FlightRoute). travel(A,B,P,[B|P],Distance) :- thereisflight(A,B,Distance). travel(A,B,Visited,FlightRoute,Distance) :- thereisflight(A,C,Distance1), C \== B, \+member(C,Visited), travel(C,B,[C|Visited],FlightRoute,Distance2), Dist is Distance1+Distance2.
如果您需要确定此方法是否可重写,则仅检查virtual final
是不够的,还需要检查IsVirtual
是否为假。
这里是执行此检查的扩展方法:
IsFinal