2011-01-06 1 views

ответ

7

abstract означает, что производный класс вынужден реализовать его, а с виртуальным это не так (он может, но не требуется). Это связано с тем, что абстрактный метод не имеет связанного тела, пока действует виртуальный метод.

+0

Вы могли бы пойти в что абстрактный метод является (особым видом) виртуальным методом. – GolezTrol

0

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

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

Рассмотрим следующие C# примеры классов:

abstract class TaskBase { 
    public abstract void RunTask(); 
} 

class RoadNetwork { 
    public string GetCorrectSideToDriveOn() { return "left"; } 
} 

Конструкция TaskBase класса заставляет производный класс, чтобы обеспечить свою собственную реализацию RunTask(), потому что код не будет компилироваться без него. Дизайнер действительно говорит: «Задачи должны быть запущены, но вы должны обеспечить реализацию, потому что нет значимого дефолта».

Конструкция RoadNetwork класс работает по-разному: кто-то, кто реализует RoadNetwork будет автоматически использовать правильную сторону дороги, чтобы ехать дальше, если они специально не решили ехать на изнаночной стороне;)

Смежные вопросы