Абстрактное и реальное наследование классов в C#

StackOverflow https://stackoverflow.com/questions/604058

  •  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) моделирования.Нет никакой разницы в отношении правил наследования и замены.Есть несколько технических нюансов:

  • Абстрактный класс не может быть экземпляр
  • Абстрактные методы разрешены только в абстрактных классах

Но абстрактный класс может иметь неабстрактные методы, свойства и поля.

Производительность не связана с классами, но существует небольшое ограничение для абстрактных / виртуальных методов.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top