Композиция против наследования в ООП и C#

автор vadim


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

В этой статье мы углубимся в эти две концепции ООП и поймем, когда, почему и как их использовать в наших .NET-приложениях. Для работы с примерами кода, представленными в этой статье, в вашей системе должна быть установлена ​​Visual Studio 2022. Если у вас еще нет копии, вы можете скачать Visual Studio 2022 здесь.

Создайте проект консольного приложения в Visual Studio.

Прежде всего, давайте создадим проект консольного приложения .NET Core в Visual Studio. Предполагая, что Visual Studio 2022 установлена ​​в вашей системе, выполните шаги, описанные ниже, чтобы создать новый проект консольного приложения .NET Core в Visual Studio.

  1. Запустите интегрированную среду разработки Visual Studio.
  2. Нажмите «Создать новый проект».
  3. В окне «Создать новый проект» выберите «Консольное приложение (.NET Core)» из списка отображаемых шаблонов.
  4. Нажмите “Далее.
  5. В следующем окне «Настройка нового проекта» укажите имя и местоположение нового проекта.
  6. Нажмите “Далее
  7. В следующем окне «Дополнительная информация» выберите «.NET 7.0 (стандартная поддержка)» в качестве версии платформы, которую вы хотите использовать.
  8. Щелкните Создать.

Мы будем использовать этот проект для работы с примерами наследования и композиции в последующих разделах этой статьи.

Повторное использование в объектно-ориентированном программировании

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

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

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

Что такое наследование в ООП? Почему вы должны его использовать?

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

Использование наследования облегчает повторное использование кода, поскольку базовые классы определяют общие методы, которые могут быть расширены или заменены производными классами. Объекты разных производных типов могут взаимозаменяемо обрабатываться их общим суперклассом благодаря их иерархической структуре и полиморфизму.

Наследование имеет ряд преимуществ:

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

Однако у наследования есть и недостатки:

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

Используйте наследование в ООП и C#

Чтобы реализовать наследование в C#, вы должны использовать ключевое слово extends, как показано в приведенном ниже фрагменте кода.

public class Person
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Address { get; set; }
    public string City { get; set; }
    public string PostalCode { get; set; }
    public string Country { get; set; }
}
public class Customer: Person
{
    //Write the members of the customer class here
}
public class Supplier : Person
{
    //Write the members of the supplier class here
}

Что такое композиция в ООП? Почему вы должны его использовать?

Композиция — это механизм, который позволяет экземпляру или объекту класса содержать экземпляры того же или других классов. Он устанавливает отношение «имеет» между классами (автор имеет book), где один класс содержит объект другого класса.

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

Используйте композицию в OOPS и C#

В следующем фрагменте кода показано, как можно реализовать композицию на C#.

public class Book
{
    public int Id { get; set; }
    public string Title { get; set; }
}
public class Author
{
    protected List<Book> books = new List<Book>();
    //Other members
}

Почему композиция предпочтительнее наследования?

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

  • Все подклассы базового класса будут вынуждены придерживаться реализации интерфейса.
  • Реализация базового класса может стать трудной для изменения с течением времени.
  • Тесная связь между базовым классом и всеми его подклассами может препятствовать развитию.

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

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

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

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

Далее прочитайте это:

  • Лучшее программное обеспечение с открытым исходным кодом 2022 года
  • Разработчики не хотят заниматься операциями
  • 7 причин, почему Java по-прежнему великолепна
  • Почему Wasm — это будущее облачных вычислений
  • Почему оценки программной инженерии — это мусор
  • Объяснение непрерывной интеграции и непрерывной доставки

Related Posts

Оставить комментарий