Методы расширения в C# позволяют добавлять новую функциональность к классам без создания производных классов, то есть не прибегая к наследованию. Методы расширения бывают очень полезны в том случае, если мы не имеем доступа к какому-либо классу для его изменения, однако нам требуется каким-либо образом расширить возможности этого класса.
Глава 5. Классы и объекты
Разделяемые классы и методы в C# (ключевое слово partial)
В C# может использоваться такая возможность как разделяемые классы и методы. Суть разделяемого класса (или, как его ещё называют, частичного класса) состоит в том, что несколько частей одного и того же класса могут располагаться в разных файлах, но при компиляции все эти части будут собраны воедино. Рассмотрим основные моменты, связанные с использованием разделяемых классов и методов в C#.
Классы и объекты C#: класс System.Object
Абсолютно все классы в .NET и C#, в частности, включая и те, которые мы создаем самостоятельно, а равно и базовые типы данных, такие как System.Int32
, System.Double
и так далее, неявно являются наследниками класса Object
. В любом случае, даже если при создании своего класса мы не указываем класс Object
в качестве родительского, то неявно по умолчанию класс Object
стоит на вершине иерархии наследования. Исходя из этого, все типы данных и классы могут реализовать методы, определенные в классе System.Object
. Рассмотрим методы класса Object
более подробно.
Классы и объекты C#: сокрытие методов и свойств
На данные момент нам известно как в C# работает перегрузка (overload
) и переопределение (override
) методов и свойств классов. Однако, на этом возможности C# по изменению функциональности базовых свойств и методов в классах не ограничиваются. Также, одним из способов изменить функциональность метода или свойства, унаследованного от базового класса, является сокрытие (hiding или shadowing). И сегодня мы будем рассматривать именно этот вопрос — сокрытие методов и свойств классов в C#.
Классы и объекты C#: виртуальные методы и свойства
При использовании механизма наследовании в C# достаточно часто появляется необходимость изменить в классе-наследнике функционал метода, который был унаследован от предка (базового класса). Для этого, в C# класс-наследник может переопределять методы и свойства базового класса. Те методы или свойства, которые мы хотим сделать доступными для переопределения, в базовом классе помечается модификатором virtual
. Такие методы и свойства обычно называют виртуальными.
Классы и объекты C#: перегрузка операторов и операций преобразования типов
О перегрузке методов мы уже знаем. Вместе с этим, в C# можно перегружать не только методы и свойства, но и операторы, например, операторы сложения и вычитания, сравнения и так далее. Более того, мы можем сделать перегрузку операций преобразования типов. И сегодня мы рассмотрим некоторые практические примеры, когда нам может пригодиться такая возможность языка программирования C# как перегрузка операторов и операций преобразования типов.
Классы и объекты C#: преобразование типов, ключевые слова as и is
На данный момент мы знаем как в C# работает наследование, как создавать потомков класса и их использовать в свих приложениях. Однако, при использовании механизмов наследования в C# (и не только) достаточно часто возникает необходимость преобразования типов объектов или же определить какой тип фактически использовался при создании какого-либо объекта в иерархии. С такой потребностью мы могли столкнуться, например, в теме про полиморфизм. До сих пор мы имели представление о преобразовании базовых типов данных. В этой части мы разберемся с тем как можно производить преобразования пользовательских типов данных.
Классы и объекты C#: индексаторы
Индексаторы в C# позволяют индексировать объекты и обращаться к данным по индексу точно также, как в массивах. По своей форме индексатор похож на свойство со стандартными блоками get
и set
, которые возвращают и присваивают значение. Сегодня разберемся с тем, как используются индексаторы в C#.
Классы и объекты C#: значение null
Классы в C#, как известно, относятся к ссылочным типам данных. Отличием ссылочных типов от типов значений состоит в том, что переменные ссылочных типов могут принимать значение null
. Сегодня мы поговорим подробно про это значение в C# и о том, как можно осуществить проверку на null
объектов C#.
Классы и объекты C#: абстрактные классы
В программировании бывают моменты, когда необходимо разработать класс, экземпляры которого нельзя создавать. Такие классы называются абстрактными. В каком случае нам может потребоваться абстрактный класс? Например, в случае, когда набор каких-либо сущностей относятся к одной и той же области знаний, но могут иметь различные реализации одних и тех же свойств и методов. Для примера, представим себе такую задачу — нам необходимо разработать систему учёта сотрудников в учебном заведении. Студент и преподаватель — это два человека у которых может быть имя, фамилия, отчество и так далее. При этом у преподавателя есть звание, должность, какие-то свои характеристики, например, стаж работы. У студента тоже могут быть свои, характерные только для него свойства, например, курс на котором он учится, группа, средний балл по всем изучаемым дисциплинам и т.д. Таким образом, исходя из этих данных, можно выделить следующие важные для нас сущности — преподаватель и студент. Абстрактный класс в этом случае — человек, то есть этот класс будет чем-то общим между студентом и преподавателем. Теперь попробуем реализовать нашу задачу в коде C#.