Может кто-нибудь связать меня с каким-то кодом, где есть фантастическое или приятное использование Наследования - PullRequest
4 голосов
/ 22 апреля 2010

Я твердо верю, что чтение кода и чтение хорошего кода является ключом к хорошему программированию. Если не один из многих.

Я столкнулся с некоторыми проблемами при визуализации и ощущении «использования» наследования для улучшения моей архитектуры кода.

Может ли кто-нибудь дать мне ссылку на хороший код для подражания, где люди использовали наследование в абсолютной «безжалостной кунг-фу» манере [хорошим способом]

Ответы [ 4 ]

1 голос
/ 22 апреля 2010

Я твердо верю, что чтение кода и чтение хорошего кода является ключом к хорошему программированию

Трудно не согласиться.

На самом деле, вопрос довольно сложный - потому что тамЕсть некоторые альтернативы наследования, такие как составной принцип повторного использования, поэтому иногда очень трудно отделить, если наследование используется «безжалостным» способом или есть какой-то лучший способ реализовать то же самое, что сделает код более понятным для понимания / тестирования/ сделать его слабосвязанным и так далее.По моему скромному мнению, блок проверки приложения Enterprise Library, с классом Microsoft.Practices.EnterpriseLibrary.Validation.Validator со всеми его потомками, является очень хорошим примером наследования, поскольку концепция

  • валидации легко понять
  • есть хороший пример того, как найти общее в объектах с довольно различной природой (например, OrCompositeValidator / DateTimeRangeValidator / ObjectCollectionValidator)
  • многие из нас пытались реализовать что-то большее илименьше, как это, поэтому этот фон даст больше качества для понимания
  • это ясно (для меня, но я могу ошибаться :), что наследование не имеет альтернативы там

Вы можетескачать исходный код из codeplex.

1 голос
/ 22 апреля 2010

Вот личный пример, где я использовал наследование, чтобы значительно улучшить ситуацию развития:

Мне нужно было разработать набор элементов управления asp.net (c #), который позволял бы как стандартным веб-формам (связка полей формы с кнопкой отправки), так и защищенной версии, которая обращается к веб-службе для отправки информация по SSL.

Из-за всех сходств между элементами управления и концепциями, я разработал ряд классов:

BaseWebControl

  • пользовательский базовый класс управления, который наследуется от System.Web.UI.WebControl класса (часть .NET Framework
  • имеет пользовательские свойства и методы, которые используются в нашем приложении всеми пользовательскими элементами управления (информация о состоянии элемента управления и т. Д.)

BaseFormControl

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

EmailFormControl

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

SecureFormControl

  • Опять наследуется от BaseFormControl, поэтому он получает все базовые функции, описанные выше, без дублирования
  • При реализации SubmitForm он подключается к веб-службе WCF и передает информацию через SSL.
  • никаких других функций не требуется, потому что базовый класс обрабатывает все остальное.

В урезанной кодовой форме общий план таков:

public class BaseWebControl : System.Web.UI.WebControl
{
    //base web control with application wide functionality built in
}

public abstract class BaseFormControl : BaseWebControl
{
    //handles all 'common' form functionality
    //...
    //...

    //event handler for submit button calls abstract method submit form, 
    //which must be implemented by each inheriting class
    protected void btnSubmit_Click(object sender, EventArgs e)
    {
        SubmitForm();
    }

    protected abstract SubmitForm();
}

public class EmailFormControl : BaseFormControl
{
    protected override SubmitForm()
    {
        //implement specific functionality to email form contents

    }
}

public class SecureFormControl : BaseFormControl
{
    protected override SubmitForm()
    {
        //connect to WCF web service and submit contents
    }
}

В результате вышесказанного, BaseFormControl имеет около 1000 строк кода в целом ряде методов, свойств и т. Д. SecureFormControl и EmailFormControl каждая имеет около 40 строк. Все остальные функции совместно используются и контролируются базовым классом. Это способствует:

  • ремонтопригодность
  • эффективность
  • гибкость
  • консистенция

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

И этот список можно продолжить.

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

1 голос
/ 22 апреля 2010

Я согласен с рекомендацией взглянуть на библиотеку базовых классов .NET, поскольку в ней есть отличные примеры абстракции как через наследование, так и через интерфейсы. Цель состоит в том, чтобы изолировать потребительский код от необходимости заботиться о деталях конкретной реализации. Дизайнер WinForms работает с элементами управления, но он не знает, какие конкретные типы элементов управления будут реализованы. Это не волнует, потому что наследование абстрагирует ненужные детали. LINQ работает аналогично с IEnumerable; на самом деле не имеет значения, что перечисляется, так как есть алгоритмы, которые вы можете написать, которые работают с любым перечисляемым. Оба являются отличными примерами хорошо используемой абстракции.

1 голос
/ 22 апреля 2010

Примером правильного использования наследования могут быть классы .NET Framework. Вы можете скачать проект MONO, чтобы получить доступ к некоторому исходному коду. Если вы хотите улучшить свою архитектуру кода, потратьте некоторое время на изучение шаблонов архитектурного проектирования.

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