Почему свойство, унаследованное от интерфейса, становится виртуальным?
Скажем, у меня есть один интерфейс и два класса, и один из классов реализует этот интерфейс:
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([email protected]"{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
Есть причина для этого?
Ответы
Ответ 1
Как в разделе замечаний по документации MS:
Виртуальный член может ссылаться на данные экземпляра в классе, и на него следует ссылаться через экземпляр класса... В среде общего языка требуется, чтобы все методы, реализующие элементы интерфейса, были помечены как виртуальные; поэтому компилятор помечает метод virtual final
Если вам необходимо определить, можно ли переопределить этот метод, тогда проверки IsVirtual
недостаточно, и вам также необходимо проверить, что IsFinal
имеет значение false.
Вот метод расширения, который делает эту проверку:
public static bool IsOverridable(this MethodInfo method)
=> method.IsVirtual && !method.IsFinal;