Аннотация против наследования реального класса в C # - PullRequest
2 голосов
/ 03 марта 2009

Мне интересно, есть ли какие-либо различия с производными классами при использовании абстрактных и реальных классов для наследования?

Мне кажется, что наследование реального класса создает иерархию, тогда как наследование абстрактного класса - это просто код копирования и вставки для компилятора в производные классы?

Создает ли абстрактный класс иерархию? Можно ли получить к нему доступ с помощью специального ключевого слова?

Я знаю, что вы используете ключевое слово base для доступа к базовому классу, но абстрактные члены выглядят так же, как исходные члены в производных классах?

Наконец, в чем разница в производительности между 2?

Ответы [ 5 ]

5 голосов
/ 03 марта 2009

Да, абстрактный класс существует - компилятор не выполняет копирование-вставку. Вы не найдете никакой разницы в производительности, поскольку 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.

3 голосов
/ 03 марта 2009

Единственное отличие состоит в том, что абстрактный базовый класс не может быть создан без наследования, тогда как неабстрактный может. С точки зрения производного класса все одинаково.

1 голос
/ 03 марта 2009

Абстрактные классы и конкретные классы являются инструментами для (ОО) моделирования. Нет никаких различий в отношении правил наследования и замещения. Есть несколько технических особенностей:

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

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

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

0 голосов
/ 18 ноября 2011

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

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

0 голосов
/ 06 сентября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...