Определение класса на языке С#:
class класс {
тип переменная;
тип метод(аргументы) {
программный код
}
}
Определение класса состоит из определения поля класса (информация, описывающая объекты данного класса) и методов класса (действия, которые либо могут выполнять объекты данного класса, либо можно выполнять над объектами данного класса).
Объектно-ориентированных подход в программирования опирается на следующие принципы:
- инкапсуляция;
- наследование;
- полиморфизм.
Инкапсуляция - способность прятать детали реализации объектов от пользователей этих объектов. Инкапсуляция, с одной стороны, позволяет скрывать от пользователя объекта детали его внутренней реализации (принцип "черного ящика"), а, с другой стороны, используется для предотвращения неконтролируемого доступа к внутренним данным объекта.
Наследование - возможность создавать новые определения классов на основе существующих, расширяя и переопределяя их функциональность. Наследование используется для повторного использования кода. Наследование бывает двух видов: отношение типа "быть" (классическое наследование) и отношение типа "иметь" (включение или делегирование).
Полиморфизм - поддержка выполнения нужного действия в зависимости от типа передаваемого объекта. Полиморфизм применяется для универсальной обработки схожих объектов разных типов. Полиморфизм бывает двух видов: основанный на "раннем связывании" (использует механизм виртуальных методов в классах, связанных классическим наследованием) и "позднем связывании" (используется для объектов, не связанных наследованием).
Для реализации инкапсуляции в языке C# используются модификаторы доступа и свойства. Язык С# поддерживает следующие модификаторы доступа (модификаторы видимости):
- public - поля, свойства и методы являются общедоступными.
- private - поля, свойства и методы будут доступны только в классе, в котором они определены.
- protected - поля, свойства и методы будут доступны как в классе, в котором они определены, так и в любом производном класса.
- internal - поля, свойства и методы будут доступны во всех классах внутри сборки, в которой определен класс.
Для контроля доступа к полям класса в языке C# можно использовать свойства. Внутри класса свойство определяется в виде пары методов для присвоения значения свойств и для чтения значения свойства. Для пользователей объектов класса свойство представляется как поле класса. Синтаксис определения свойства класса:
тип свойство {
get {
return значение;
}
set {
поле=value;
}
}
Метод get используется для получения значения свойства. Метод set используется для изменения значения свойства. Внутри метода set новое значение свойства передается в виде переменной value. С помощью свойств можно проверить новое значение поля, прежде, чем изменить поле; выполнить дополнительные действия при изменении или чтении поля, представить для пользователя в виде поля информацию, которая на самом деле не является полем класса.
Для реализации классического наследования в языке C# используется следующий синтаксис:
class потомок: родитель {
}
Язык C# не поддерживает множественное наследование. Для вызова в конструкторе класса-потомка конструктора класса-родителя используется ключевое слово base:
class потомок: родитель {
потомок(аргументы):base(аргументы){
}
}
Также ключевое слово base используется для вызовов методов класса-родителя из переопределенных методов в классе-потомке. Язык C# также поддерживает наследование включением.
Для реализации полиморфизма, основанного на виртуальных методах, в языке C# используются ключевые слова virtual и override:
class родитель {
virtual метод(аргументы){
}
}
class потомок: родитель {
override метод(аргументы){
}
}
Кроме того, язык C# поддерживает объявление абстрактных методов с помощью ключевого слова abstract. Абстрактные методы не содержат реализации и должны быть переопределены с помощью ключевого слова override в классах-потомках. Класс, в котором объявлен хотя бы один абстрактный метод, является абстрактным и должен быть объявлен в помощью ключевого слова abstract. Объекты абстрактного класса не могут быть созданы.