Подтвердить что ты не робот

Является ли каждая абстрактная функция виртуальной в С# вообще?

Я рассматривал вопрос о переполнении стека В чем разница между абстрактной функцией и виртуальной функцией?, и мне было интересно, следует ли рассматривать каждую абстрактную функцию как виртуальная функция в С# или вообще?

Я был немного озадачен "вы должны переопределить/вы можете переопределить" ответы на этот вопрос. Не будучи программистом на С#, я склонен думать, что абстрактные функции - это только концепция времени компиляции, и что абстрактные функции являются виртуальными функциями по определению, поскольку вы должны предоставить хотя бы одно, но можете предоставить несколько реализаций дальше по иерархии.

У виртуальных функций также есть измерение времени компиляции, поскольку вы не можете переопределить не виртуальную функцию, но они в основном представляют собой концепцию времени выполнения, поскольку это "просто" выбор правильной реализации метода на основе фактического получателя.

4b9b3361

Ответ 1

Да. Из раздела 10.6.6 описания С# 3.0:

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

Ответ 2

В нем есть виртуальный (и Джон Скит уже выбил спецификацию, чтобы доказать, что это так), потому что, учитывая ссылку на абстрактный базовый класс, конкретная реализация производного класса должна быть называется. Например, учитывая классическую иерархию животных:

abstract class Animal{
    public abstract void Speak();
}

class Cat : Animal{
    public override void Speak(){Console.WriteLine("meow");}
}

class Dog : Animal{
    public override void Speak(){Console.WriteLine("bark");}
}

Функция, которая принимает объект Animal и вызывает его метод Speak, не знает, какую реализацию вызывать, если функция не была виртуальной.

static void TalkToAnimal(Animal a){
    Console.WriteLine("Hello, animal.");
    a.Speak();
}

Обратите внимание, однако, что реализации интерфейса по умолчанию являются не. Поскольку интерфейс работает по-другому от класса, истинный полиморфизм не нужен, чтобы найти реализацию метода интерфейса.

Ответ 3

Да, это так. Для доказательства:

abstract class A {
    public abstract void Foo();
}
class B : A {
    public override void Foo()
    { /* must do */ }
}
class C : B {
    public override void Foo()
    { /* can do */ }
}

Ответ 4

Да.

Объявление абстрактного свойства указывает, что аксессоры свойства являются виртуальными, но не обеспечивают фактической реализации аксессуаров. (MSDN)

Ответ 5

Я думаю, что вы смотрите на проблему с точки зрения "С++" (будьте осторожны, избегайте необходимых ключевых слов, сохраняйте нажатие клавиш).

Философия С# - это то, что код должен быть чистым от чтения источника, и компилятор должен уметь проверять это намерение как можно больше.

Итак, хотя в сгенерированном MSIL очень мало различий между абстрактным методом и виртуальным методом (или, что то другое, между абстрактным и не-абстрактным классом или между параметром out и параметром ref) дополнительные ключевые слова говорят программистам-программистам что-то, и позволяют компилятору дважды проверить, что вы делаете.