2016-10-10 5 views
1

Почему HttpContext абстрактный класс, а не интерфейс?Почему HttpContext представляет собой абстрактный класс вместо интерфейса?

Этот класс является публичным аннотатом, и все методы являются абстрактными. Я не понимаю, почему этот класс является абстрактным классом.

Какие существуют причины, по которым это абстрактный класс вместо интерфейса?

+2

Эти вопросы по дизайну трудно ответить без канонического источника, поэтому это в значительной степени мнение, если кто-либо из команды ASP.NET не может войти и ответить. Тем не менее, я подозреваю, что это связано с тем, что вы не можете добавлять участников в интерфейс, не нарушая контракт интерфейса для разработчиков (добавьте новый член в интерфейс и все перестанет компилировать). С абстрактным классом могут быть добавлены «виртуальные» элементы, которые могут быть реализованы. Команда ASP.NET приняла этот шаблон в нескольких местах. – vcsjones

+1

Обычно абстрактные базовые классы содержат некоторые значения по умолчанию (например, полезность) или частичную реализацию, которые могут реализовывать реализации подкласса, тогда как с помощью интерфейса нет места для «зависания» этого материала. Таким образом, проще «развернуть» индивидуальную реализацию. Даже если все методы являются виртуальными, дверь все еще открыта для этого, так что это может создать «слои» частичной/вспомогательной реализации для подклассов. –

+0

@ escape-llc Действительно. Но в этом случае это не так. Вот что заставило меня задуматься ... – Fred

ответ

1

Это ответ, который я получил от Дэниела Рот в Microsoft, который работает с ASP.NET Core.

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

0

Есть много мнений по этой теме (например, here и here). И даже если команда ASP.NET обычно используют интерфейсы, я могу думать о нескольких причинах, почему они выбрали для абстрактного класса в этом случае:


управления версиями Я не ожидал, что HttpContext класса изменить много, но абстрактная версия классов проще, чем интерфейсы (на самом деле они не версии), поскольку они могут быть частично реализованы с использованием ключевого слова virtual.

Инкапсуляция
Абстрактные классы инкапсулировать набор функциональных возможностей, где интерфейсы обеспечивают более контракта для определенной функциональности. Классы могут реализовывать только один абстрактный класс, что имеет смысл для реализации HttpContext, например DefaultHttpContext.

Обратная совместимость
Хотя ASP.NET Ядро является полностью переписанный ASP.NET, разработчики используют для программирования против HttpContext класса в течение многих лет. Оба класса имеют много характеристик.


Имейте в виду, что я просто угадываю здесь, возможно, некоторые люди из команды ASP.NET могли бы просветить нас.

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

  • Нет связанных вопросов^_^