Абстрактное и реальное наследование классов в C#
-
03-07-2019 - |
Вопрос
Мне интересно, есть ли какие-либо различия между производными классами при использовании абстрактных и реальных классов для наследования?
Мне кажется, что реальное наследование классов создает иерархию, тогда как абстрактное наследование классов - это просто копирование-вставка кода компилятором в производные классы?
Создает ли абстрактный класс иерархию?Можно ли получить к нему доступ с помощью специального ключевого слова?
Я знаю, что вы используете ключевое слово base для доступа к базовому классу, но абстрактные члены выглядят точно так же, как исходные члены в производных классах?
Наконец, в чем разница в производительности между этими двумя?
Решение
Да, абстрактный класс действительно существует - компилятор не выполняет копирование-вставку.Однако вы не обнаружите никакой разницы в производительности, поскольку среда CLR по-прежнему должна выполнять вызовы виртуальных методов.
Например, следующий C#:
abstract class Foo { }
class Bar : Foo { }
генерирует следующий IL:
.class private abstract auto ansi beforefieldinit Foo
extends [mscorlib]System.Object { }
.class private auto ansi beforefieldinit Bar
extends Foo { }
Концепция абстрактного типа в значительной степени является частью IL.
Другие советы
Единственное отличие заключается в том, что абстрактный базовый класс не может быть создан без того, чтобы быть производным от него, в то время как неабстрактный класс может.С точки зрения производного класса, все то же самое.
Абстрактные классы и конкретные классы являются инструментами для (OO) моделирования.Нет никакой разницы в отношении правил наследования и замены.Есть несколько технических нюансов:
- Абстрактный класс не может быть экземпляр
- Абстрактные методы разрешены только в абстрактных классах
Но абстрактный класс может иметь неабстрактные методы, свойства и поля.
Производительность не связана с классами, но существует небольшое ограничение для абстрактных / виртуальных методов.
Сила абстрактного класса заключается в его нереализованности.Это может быть использовано для уверенности в том, что экземпляр производных классов будет обладать всей необходимой функциональностью
Абстрактный класс - это примитивная форма базового класса.Они не могут быть созданы, что означает, что разработчик должен быть производным от этих классов, чтобы использовать их функциональность.Любой абстрактный метод, определенный в абстрактном классе, должен быть реализован в его дочернем классе.Таким образом, можно реализовать методы, которые должны присутствовать в дочернем классе, производном от абстрактного класса.Таким образом, вы определяете базовые элементы объекта, которые разработчик может настроить в производном классе по своему усмотрению.
Неабстрактные классы лучше всего использовать для расширения функциональности класса, в то же время продолжая использовать то, что находится в неабстрактном классе.Производный класс может получить доступ ко всем непубличным членам и методам.