Почему свойство, унаследованное от интерфейса, становится виртуальным? - PullRequest
0 голосов
/ 27 ноября 2018

Допустим, у меня есть один интерфейс и два класса, и один из классов реализует этот интерфейс:

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

Есть ли причины для этого?

1 Ответ

0 голосов
/ 27 ноября 2018

Начиная с примечаний к разделу документации MS :

Виртуальный член может ссылаться на данные экземпляра в классе, и на него нужно ссылаться через экземпляр класса ...общеязыковая среда выполнения требует, чтобы все методы, реализующие элементы интерфейса, были помечены как виртуальные;следовательно, компилятор помечает метод virtual final

Если вам необходимо определить, можно ли переопределить этот метод, то проверки IsVirtual недостаточно, и вам также необходимо проверить, что IsFinal имеет значение false.

Вот метод расширения, который выполняет эту проверку:

public static bool IsOverridable(this MethodInfo method)
    => method.IsVirtual && !method.IsFinal;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...