Найти в Дзене
Изучаем C# - Пример ООП (часть 4)
Предыдущие статьи: В прошлой статье мы сделали CRUD-сервисы для работы с сущностями Person (человек) и DisabilitySheet (больничный). Теперь надо сделать CRUD-сервисы для AppointmentOrder (приказ о назначении) и HolidayOrder (приказ об отпуске). Поскольку у этих двух сущностей есть общие поля, мы создали для них общий базовый класс BaseOrder (базовый приказ). Поскольку иерархия CRUD-сервисов повторяет иерархию сущностей, то мы должны сначала сделать сервис для BaseOrder и уже потом - для этих двух сущностей...
3 дня назад
Изучаем C# - Пример ООП (часть 3)
Часть 1: Часть 2: Сейчас будет трудная тема, но зато она активно используется на практике. Итак, мы имеем сервис для людей - PersonService. Нам также надо создать сервисы для каждой нашей сущности: AppointmentOrderService, HolidayOrderService, DisabilitySheetService. Однако, если мы начнём их создавать, то увидим, что они похожи друг на друга. Много кода дублируется. А дублирование кода - это плохо, потому что его надо будет поддерживать: со временем придётся делать какой-то новый функционал, что-то менять, и придётся менять каждый сервис по отдельности, что долго и неудобно...
1 неделю назад
Изучаем C# - Пример ООП (часть 2)
Ранее мы начали делать большой пример объектно-ориентированного программирования: Теперь допишем его. Сделаем в нашем PersonService методы Create / Read / Update / Delete ("Создать / Считать / Обновить / Удалить"). Начнём по порядку с Create(): Поскольку метод Create должен создавать человека, он получает его на вход. Мы сначала проверяем, не существует ли уже этот человек, по Id. Если такого человека нет, то метод Persons.FirstOrDefault() вернёт null и мы зайдём в if, где будет кинуто исключение...
1 неделю назад
Изучаем C# - Пример ООП (часть 1)
Мы завершаем изучение объектно-ориентированного программирования, и теперь нам нужен хороший пример, на котором можно было бы всё это повторить. Пусть мы хотим сделать систему для веб-приложения, работающего с электронными документами. Это большая и сложная задача, но зато она приближена к тому, что делают в реальной жизни. Электронные документы каждого вида можно создавать (Create), читать (Read), обновлять (Update) и удалять (Delete). Подобные системы называются CRUD - по первым буквам действий...
1 неделю назад
Изучаем C# - Универсальные (обобщённые) типы
Пусть у нас есть несколько классов животных: базовое животное BaseAnimal, черепаха Turtle, собака Dog. Если вы не создали их в предыдущих статьях, ничего страшного - просто создайте пустые классы. Черепаха и собака наследуются от базового животного. Пусть мы хотим сделать коробки для животных. Коробка - это такой класс, который должен работать так: То есть, при создании коробки черепаха помещается внутрь, а при вызове метода Get() выдаётся наружу. Реализация коробки проста: Получив черепаху на вход конструктора, коробка запоминает её в приватном поле, чтобы затем выдать наружу...
1 неделю назад
Изучаем C# - Методы расширения
Некоторые классы в C# мы не можем изменить. Например, это классы из разных библиотек. Чтобы изменить их, нужно было бы влезть внутрь библиотеки и отредактировать её, что невозможно. Но бывает, что нам хочется добавить в такие классы новый метод. Решение проблемы есть - написать метод расширения. Метод расширения - это метод, который написан вне класса, но может применяться так же, как обычный метод - объект.Метод() Чтобы сделать метод расширения, нужно соблюсти ряд условий: Пусть даны два списка из строк...
2 недели назад
Изучаем C# - Ещё про методы (часть 2)
Пусть у нас есть класс Point ("Точка") (оставшийся от предыдущей статьи или новый): В C# любой объект может превращаться в строку. Например, если мы напишем в файле Program.cs печать в консоль точки point1, то в консоли появится За превращение объекта в строку отвечает метод ToString() (его название переводится как "к строке"). Он есть у всех классов, даже когда мы его не пишем, в силу наследования всех классов от object (потом мы изучим, что это такое). Также ToString() вызывается автоматически, нам необязательно писать point1...
2 недели назад
Изучаем C# - Пишем статические поля и методы. Паттерн Singleton
Мы уже умеем писать методы в классах. Обычные методы вызываются у объектов класса. Например, пусть мы имеем класс Point ("точка"): У него есть два конструктора (для создания точки с 0, 0 и с заданными x, y) и метод PrintMe(), который печатает координаты точки в консоль. Это значит, что если мы создадим объект этого класса, то у объекта внутри будет метод PrintMe(): Также внутри точки будут поля X и Y. Они создаются внутри каждой точки. Статические поля и методы отличаются от обычных тем, что они принадлежат не конкретному объекту класса, а классу как таковому...
3 недели назад
Изучаем C# - Абстракции в ООП. Интерфейсы
В бытовом смысле, например, автомобильный интерфейс означает руль, педали, спидометр и тахометр, кнопки, то есть, приборы, через которые водитель взаимодействует с автомобилем. Слово "Интерфейс" и переводится как внешний вид для взаимодействия. Благодаря тому, что руль и педали на всех автомобилях работают одинаково, то есть, разные автомобили имеют одинаковый интерфейс, водителю не нужно переучиваться, чтобы взаимодействовать с другим автомобилем. Также и в программировании: интерфейс - набор публичных методов, которые видны тем, кто взаимодействует с классом...
3 недели назад
Изучаем C# - abstract protected-методы
Из предыдущей статьи мы знаем, что модификатор доступа protected используется, когда поле/свойство/метод должны быть видны в классах-наследниках, но не видны снаружи класса. Сейчас мы разберём пример применения этого слова. Из статьи мы знаем, что один класс может наследоваться от другого. Например, черепаха наследуется от животного. При этом класс-наследник (черепаха) автоматически включает в себя всю логику (то есть все поля, свойства и методы) базового класса (животное). Говоря простым языком, черепаха является животным...
3 недели назад
Изучаем C# - Наследование и полиморфизм в ООП
Это одна из самых больших и важных тем. В прошлых статьях мы начали делать забег животных. Мы создали класс Animal, который реализует логику бегуна - за каждый вызов метода Move() координата _x увеличивается на _speed: Теперь добавим новые виды бегунов - новые классы. Пусть черепаха бегает по тем же правилам, но дополнительно может прятаться в панцирь. По вызову метода Hide() она прячется и не может двигаться до вызова метода Show(). Пусть собака двигается так же, как и все животные, но дополнительно гавкает при каждом передвижении...
3 недели назад
Изучаем C# - Свойства, геттеры и сеттеры
В предыдущей статье https://dzen.ru/a/aZ7YnxBR5GpuouEh?share_to=link мы разобрали пример класса с инкапсуляцией - координата "_x" животного могла изменяться только изнутри класса, она была защищена от изменений снаружи модификатором private. Однако, чтобы мы могли узнать координату, пришлось добавлять отдельный метод GetX(). Если бы мы могли сказать, что изменение координаты возможно только private, а чтение - public, проблемы бы не возникло. На самом деле, в подобных ситуациях используют свойства...
1 месяц назад