Объяснение основных концепций объектно-ориентированного программирования на C#

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

Приветствую моего брата и наставника Тобиаса Стренга
Если вам понравилась эта статья и вы хотите узнать больше о программировании в .Net и Angular, подпишитесь на нас :P

Содержание:

  • Классы и объекты
  • Методы
  • Конструктор и деструктор
  • Инкапсуляция
  • Модификаторы доступа
  • Геттеры и сеттеры
  • Делегаты
  • Наследование
  • Дженерики
  • Абстрактные классы и интерфейсы
  • Статические классы и статические методы

Классы и объекты:

Ориентация на объекты описывает способ лучшей визуализации написанного исходного кода. Это перспектива разработки программного обеспечения, которая описывает сложные системы с использованием объектов и использует для этой цели классы и методы.
Таким образом, экземпляр класса является объектом. Чтобы точнее проиллюстрировать этот принцип класса, в качестве примера служит человек. У всех людей есть определенные характеристики, такие как имя или дата рождения. Каждый особенный человек — это объект.
Если теперь классу Person присвоить свойства, такие как имя, возраст, рост и пол, постепенно возникает поверхностный образ человека. Указанные свойства еще не имеют никаких значений при создании класса, потому что здесь определяется только то, какие свойства должен иметь более поздний объект, путем указания типа данных, из которого происходит соответствующее свойство. Здесь используется своего рода план, чтобы определить, что такое человек.
Если требуется один объект, вы можете использовать команду new() для создания экземпляра класса Person. Вызывается конструктор, и разработчику предоставляется возможность присваивать значения. Например, здесь мы можем создать человека Петра с именем Петр, возрастом 41 год, ростом 1,82 и полом Мужской. Питер является экземпляром/сформированным объектом класса Person. Объект также может содержать методы. Пример показывает изображение после слова "Методы"

Методы:

Под методом можно понимать своего рода «подпрограмму», в которой могут быть объединены определенные функции программы. Существуют различные способы определения методов. Методы можно сделать видимыми или невидимыми для других классов проекта по всему миру с помощью публичных и частных ключевых слов. Также можно определить тип возвращаемых данных, который может быть назначен как переменная, например, при вызове метода. Это возвращается в теле метода с ключевым словом return и предоставляется в заголовке метода как соответствующий тип данных, например. целое число. Если это не требуется, ключевое слово void пишется там же в заголовке метода. Кроме того, методы могут содержать и использовать параметры. Метод может быть привязан к объекту, если он не определен как статический и создан в классе, в котором определен план объекта. Например, в предыдущем примере Person вы могли бы добавить метод go(). Если метод не является статическим, его можно вызвать только в том случае, если он вызывается с использованием записи через точку за экземпляром класса, то есть объектом. Однако если метод должен вызываться без привязки к объекту, его можно определить как статический с помощью ключевого слова static.

Вот несколько основных примеров:

Конструктор и деструктор:

Конструктор – это специальная функция, которая вызывается при инициализации класса. Имя функции-конструктора всегда соответствует имени класса. Функция не имеет возвращаемого значения (даже недействительного), поскольку конструктор возвращает, так сказать, только что инициализированный объект. Если в классе не создан конструктор, всегда есть так называемый конструктор по умолчанию, который не выполняет никаких дальнейших действий. Конструктор по умолчанию не имеет параметров. Однако это можно изменить при реализации собственных конструкторов. Вы также можете перегрузить конструктор. Важно знать, что после объявления конструкторов в классе конструктор по умолчанию, автоматически создаваемый C#, больше не существует. Модификатор доступа к конструкторам обычно общедоступен. Если в качестве модификатора доступа используется private, инициализация объекта этого класса больше невозможна. Поэтому частный конструктор используется для предотвращения инициализации объекта класса, который содержит только статические функции.

Деструктор противоположен конструктору, поскольку деструктор вызывается при уничтожении/удалении объекта. Как уже упоминалось, объект автоматически удаляется, как только .NET Framework больше не может найти ссылку. Объекты автоматически удаляются сборщиком мусора (GC), если программа в настоящее время не имеет процессов для обработки или пространство для хранения критично. Кроме того, также возможно инициировать удаление объектов, на которые нет ссылок, вручную, используя статическую функцию Collect() класса GC. Имя деструктора совпадает с именем класса, но с префиксом в виде тильды. Кроме того, для деструктора нельзя указывать модификатор доступа и возвращаемое значение.

Инкапсуляция:

Инкапсуляция определяется как упаковка данных в единый блок. Это механизм, который связывает код и данные, которыми он манипулирует, вместе. С другой стороны, инкапсуляция — это защитный экран, который предотвращает доступ кода за пределами этого экрана к данным.

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

Модификаторы доступа:

Все типы и члены типов имеют уровень доступности. Уровень доступности определяет, можно ли их использовать из другого кода в вашей сборке или других сборках. Сборка — это файл .dll или .exe, созданный путем компиляции одного или нескольких файлов .cs за одну компиляцию. Используйте следующие модификаторы доступа, чтобы указать доступность типа или члена при его объявлении:

  • public: к типу или члену может получить доступ любой другой код в той же сборке или другой сборке, которая на него ссылается. Уровень доступности открытых членов типа контролируется уровнем доступности самого типа.
  • частный: доступ к типу или члену возможен только с помощью кода в том же class или struct.
  • защищенный: доступ к типу или члену возможен только с помощью кода в том же class или в class, производном от этого class.
  • внутренний: к типу или члену можно получить доступ из любого кода в той же сборке, но не из другой сборки. Другими словами, доступ к internal типам или членам можно получить из кода, являющегося частью той же компиляции.
  • защищенный внутренний: к типу или члену можно получить доступ из любого кода в сборке, в которой он объявлен, или из производного class в другой сборке.
  • private protected: к типу или члену могут обращаться типы, производные от class, которые объявлены в содержащей его сборке.

Геттеры и сеттеры:

Методы доступа, также известные как методы получения и установки, — это методы, которые разрешают доступ к переменным и тем самым обеспечивают возможность управления их значениями.

Это методы, которые позволяют использовать или изменять свойство класса

Что произойдет, если я не установлю геттеры и сеттеры?

В этом случае заданное свойство является не свойством, а полем.

Поле против свойства:

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

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

Делегаты:

Делегат — это тип, представляющий ссылки на методы с определенным списком параметров и типом возвращаемого значения. После создания экземпляра делегата вы можете связать экземпляр с любым методом, который имеет совместимую сигнатуру и тип возвращаемого значения. Вы можете вызвать метод через экземпляр делегата.
Или для простоты:
делегат — это способ хранения одного или нескольких методов в переменной.

Как видите, нам также разрешено добавлять несколько методов в один делегат.

Наследование:

При наследовании дочерний класс наследует все свойства (массивы и методы, то есть структуру и поведение) своего родительского класса и добавляет свои собственные индивидуальные свойства или переопределяет методы родительского класса. Свойства родительского класса не обязательно должны повторяться в спецификации дочернего класса. Говорят, что класс сына является производным от класса отца. Таким образом, принцип наследования просто гласит, что все свойства и методы в классе могут быть унаследованы от суперкласса. Следующий рисунок иллюстрирует принцип наследования:

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

Дженерики:

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

Абстрактные классы и интерфейсы

Для получения более подробной информации об интерфейсах, пожалуйста, ознакомьтесь с моей статьей Чистая архитектура и инверсия зависимостей

Абстрактные классы:

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

Интерфейсы:

Интерфейсы также представляют собой абстракции. Сначала интерфейс служит своего рода шаблоном для класса, реализующего этот интерфейс. Методы и, возможно, также свойства определены, но у них нет ни значений, ни функциональности. Цель этого состоит в том, чтобы диктовать классу, который реализует этот интерфейс, какие методы он должен использовать. Чтобы точнее понять принцип, можно использовать программу с базой данных. Предполагая, что исходный код определяет часть, которая читает базу данных, часть, которая обрабатывает записи в базе данных, и часть, которая выводит обработанные данные, впоследствии изменение базы данных может стать проблематичным. Однако, если требуемые методы класса выбора определены с самого начала, остальные классы не зависят от этого класса. В других классах уже определенные методы вызываются точно так же, как и раньше. У разработчика есть возможность заменить базу данных на другую без внесения изменений в исходный код при условии, что методы, определенные в классе выбора, соответствуют рекомендациям, указанным в интерфейсе. Руководящими принципами для методов могут быть, например, параметры, возвращаемое значение или глобальная доступность через ключевые слова public и private. Класс, реализующий интерфейс, должен содержать все свойства и методы интерфейса, но он также может использовать дополнительные методы или свойства. Отличие от наследования заключается в том, что методы пусты и служат лишь шаблоном.
В объектно-ориентированных языках классы, реализующие интерфейс, также могут вызываться напрямую через интерфейс, что поэтому их также называют интерфейсами. Здесь используется принцип принцип инверсии зависимостей. Как уже объяснялось, использование интерфейсов, таким образом, способствует независимости классов, а также обеспечивает меньшую подверженность ошибкам для всего проекта, лучшую архитектуру программного обеспечения и чистое программирование.

Статические классы и статические методы:

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

Заключение:

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

Пожалуйста, ознакомьтесь с другими моими статьями:

Источник: