Наследование в .NET бесполезно? - PullRequest
4 голосов
/ 05 февраля 2011

Я довольно новичок в программировании .NET. Я знаю, что .NET программирование на 100% ориентировано на объект. Интригующий абзац, который я прочитал в книге о ASP.NET 4, гласит, что

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

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

Редактировать

Пожалуйста, люди понимают мой вопрос, во-первых, автор не сказал буквально "Наследование в .NET бесполезно", это был мой способ застегнуть дырочный вопрос в некоторых словах, чтобы он подходил в качестве заголовка. Во-вторых, книга написана Apress и называется: «Начало ASP.NET 4 в C # 2010», стр. 72.

Ответы [ 10 ]

8 голосов
/ 05 февраля 2011

Я думаю, что наследование, которое представлено в большинстве вводных объектно-ориентированных академических классов , совершенно бесполезно. Вы всегда будете видеть иерархию для Animal или Shape, , но большинство реальных проблем не выглядит так .

И оба эти примера быстро разбиваются. Взгляните на классификацию видов Линнея в биологии или эту статью о форме прямоугольника, чтобы понять, что я имею в виду. Любая иерархия наследования будет нарушена после определенного количества уровней, потому что конечные классы все дальше уходят от поддержки IS-A с базовым классом.

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

Примерами того, где наследование работает хорошо, являются структуры данных и интерфейсы. Интерфейс говорит, что сигнатуры методов наследуются, оставляя детали реализации. Так что, если вы можете абстрагироваться от того, что является общим для всех реализаций List, Set или Map, у вас есть что-то, что обеспечивает структуру, но оставляет детали реализации разработчикам.

Я бы сказал, что наследование в этих случаях работает достаточно хорошо.

Как и большинство общих утверждений, цитируемое вами утверждение не всегда верно.

6 голосов
/ 05 февраля 2011

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

Автор прав, что наследование, как правило, легко использовать неправильно, и что обычно инкапсуляция является лучшим вариантом, но это не относится к .NET в любомway.

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

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

Но примите свое собственное решение.Лично я думаю, что автор сбивает с толку и, возможно, немного близорук.

3 голосов
/ 05 февраля 2011

Уч. Наследование не только полезно, но и является ключевым понятием, поскольку каждый класс наследуется от System.Object (не уверен, есть ли хаки / CLR, которых нет).

Также в некоторых технологиях, таких как ASP.net MVC, вы почти наверняка будете использовать наследование (путем создания базового контроллера).

Каждый человек использует Наследование постоянно, большую часть времени, даже не осознавая этого. В большинстве приложений меньшего / среднего размера наследование не так много, вместо этого часто используются интерфейсы, например, для внедрения зависимостей. Тем не менее, почти каждое нетривиальное приложение имеет тенденцию иметь базовый класс, плавающий где-то, от которого наследуются другие классы.

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

2 голосов
/ 05 февраля 2011

Я думаю, что большинство из того, что нужно здесь сказать, уже было сказано людьми, у которых гораздо больше опыта, чем у меня.Однако, как тот, кто перешел с VB6 / VBA на бесконечный и удивительный мир истинного наследования, доступный в .net, я могу сказать, что отговаривать новичка рассматривать его как конечное решение не обязательно плохо.

Когда я впервые начал исследовать эту идею, я обнаружил, что с помощью наследования можно делать разные интересные вещи.Но в итоге я получил довольно плохой код, сложные в обслуживании иерархии классов и общий беспорядок.Это выглядит почти волшебным решением для новичка (и даже более того для тех, кто пережил боль VB6 / VBA в течение многих лет).Реальность такова, что, как и шаблоны проектирования, наследование часто используется «потому что я могу» вместо «потому что мне нужно».

Держу пари, автор намеревался донести до сведения, что наследование, часто рассматриваемое как решение «первого порядка» для людей с меньшим опытом, ДЕЙСТВИТЕЛЬНО должно использоваться только тогда, когда это правильное решение.И что легко думать, что это может быть правильным решением в неправильных обстоятельствах.

Может быть заманчиво использовать наследование в качестве средства, облегчающего работу кодирования.В мои первые годы изучения vb.net у меня, конечно, были некоторые трудности, и часто наследование от класса, который был борьбой за создание, казалось привлекательным решением проблемы создания другой разновидности этого сложного кода.Конечно, для тех, кто учится, сложный код сегодня - предпочтительный код завтрашнего дня.

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

Но говорить, что наследование бесполезно, явно абсурдно.

Хороший способ изучить интерфейс / базовый класс / моделирование наследования см. В самой платформе .net.Из проводника объектов можно изучить модель наследования, поскольку она применяется к основным компонентам, которые мы используем каждый день.

2 голосов
/ 05 февраля 2011

Так же, как один очень маленький пример, если не было наследования, когда вы создавали форму в Windows или ASP.Net WebPage в веб-приложении, вам нужно было бы добавить весь код для всего «Окна» самостоятельно (например, ниже **) и добавьте этот код в каждую такую ​​форму или веб-страницу, которую вы создали ...
Бесполезный ??? Едва ли! * * 1002

примеры некоторых функций, которые вы "наследуете" из System.Windows.Form "
(Переместите окно вокруг, измените его размер, уменьшите, разверните, восстановите его, закрасьте экран под ним и рядом с ним, обрабатывайте сообщения, генерируемые щелчком мыши по нему, контролируйте, находится ли оно в фокусе, передайте данные туда и обратно между другие элементы экрана и т. д. и т. д.)

2 голосов
/ 05 февраля 2011

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

1 голос
/ 24 апреля 2012

По-видимому, чрезмерно реагирующие на возражения SO'ers, это довольно распространенное знание среди объектно-ориентированных программистов в наши дни.

Я немного не согласен с точным выбором слов в кавычках, но настроение не болееспорно, чем "предпочитают композиции по наследству" .

Специально для книги под названием "Начало ASP.NET" , я думаю, это довольно приличный совет.Количество раз, когда вам нужно иметь дело с наследованием, поскольку механизм проектирования в ASP.NET довольно ограничен - особенно для начинающих.

1 голос
/ 05 февраля 2011

Поскольку я работал над все большим количеством кода, я пришел к аналогичным выводам (хотя и не настолько провокационным). Одна из причин - отсутствие множественного наследования (что я сейчас согласен - это хорошо), а другая - зависимости, выходящие из-под контроля.

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

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

1 голос
/ 05 февраля 2011

В среднем случае, нет, вы не будете создавать глубокие иерархии типов.Однако вы будете напрямую использовать наследование все время .

Всегда.

Страница ASP.NET .aspx с выделенным кодом наследует от вашего класса выделенного кода.Ваш класс code-behind сам наследуется от класса Page, и вы переопределяете его методы.Если вы не понимаете значения переопределения и виртуального (оба понятия, связанные с наследованием), вы продаете себя коротко.

Существуют тысячи примеров по всей структуре, где понимание наследования и связанных с ним концепций поможет вам организовать ваше понимание объектов, которые вы используете ежедневно.Некоторые из лучших, которые действительно можно изучить, касаются LINQ и Generics (IEnumerable, IQueryable, ICollection и т. Д.), MVC / Web Forms и Entity Framework, а также того, где вы создаете объекты POCO, которые относятся к бизнес-проблеме, которую вы пытаетесь решить.1015 *

Короткий ответ: вам нужно это понять, даже если вы не пишете фреймворк.Отрывок из книги ( выдержка из стр. 72 ) немного смущает, насколько он тупой и вводящий в заблуждение.

0 голосов
/ 05 февраля 2011

Уже есть много отличных ответов, однако у меня были проблемы с пониманием ООП, когда я сам изучал его, поэтому это может помочь.

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

См. эту ссылку для реального примера наследования.Это класс Web Control в asp.net .Это класс с общим материалом для многих элементов управления, прокрутите вниз и посмотрите иерархию наследования и посмотрите, сколько элементов управления наследуют от этого элемента управления.

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