- •Эволюция языков программирования
- •Объектная декомпозиция.
- •Классы и объекты
- •Конструкторы и деструкторы.
- •Основные средства разработки классов
- •Описание класса в с#
- •Деструкторы
- •3.Методы-свойства
- •Наследование в c#
- •Интерфейсы, структуры, делегаты, события. Интерфейс.
- •Операции is и as
- •Стандартные интерфейсы .Net
- •Делегаты
Описание класса в с#
Синтаксис описания класса
[Атрибуты] [Модификаторы] class ИмяКласса [:СписокПредков]
{
ТелоКласса
}
Атрибуты:
Задают дополнительные возможности класса
Бывают стандартными и пользовательскими
Записываются в квадратных скобках
Модификаторы:
Определяют доступность класса для других объектов программы (м. доступа)
Указывают свойства класса (м. Свойства)
Модификаторы доступа:
Public (открытый) – неограничен
Private (закрытый) – закрыт для всех
Protected (защищенный) – открыт для потомков
Internal (внутренний) – открыт для класса программы (по умолчанию)
Protected internal – открыт для потомков и классов программы
(выделенные только для вложенных классов)
Модификаторы свойств:
New – задает новое описание вложенного класса взамен унаследованного
Abstract – абстрактный класс
По умолчания никогда не устанавливаются
Класс с модификатором abstract называется абстрактным
Для абстрактного класса невозможно создавать экземпляры класса, но можно задавать потомков.
Пример Array
Sealed – запечатанный класс
Класс с модификатором sealed является запечатанным (бесплодным) классом
Запечатанные классы не могут иметь потомков
Многие стандартные типы (классы) являются запечатанными
Пример String
Static – статистический класс
Класс с модификатором static является статическим классом
Экземпляры статического класса запрещено создавать
От статического класса нельзя наследовать
Статические классы могут иметь только статические поля и методы.
Пример Math
Список предков:
В С# не может состоять более чем из одного класса, но может содержать несколько интерфейсов (спец. Вид классов, не имеющих реализации).
Если имя предка не указано, то предком считается базовый класс всей иерархии – System.Object.
Примеры писания классов:
Class MyClass1 {} // internal
Public Class MyClass2 {} // public
Class MyClass: MyClass1
{
Private class MyClass4 {}
Protected class MyClass5 : MyClass2 {}
}
В состав класса могут входить:
Константы
Поля
Конструкторы и деструкторы
Методы
События
Классы
Делегаты
Структуры
Интерфейсы
Перечисления
Поля класса:
Поле – это переменная, объявленная на уровне класса
Поля описывают свойства объектов класса
При создании новый объект класса представляет собой набор полей класса
Два объекта одного класса имеют один и тот же набор полей, но отличаются расположением в памяти и значениями, хранимыми в этих полях.
Синтаксис описания поля:
[Атрибуты]
[Модификаторы] [const] ТипПоля
ИмяПоля [=НачальноеЗначение]
Модификаторы доступа:
Private – по умолчанию
Public
Protected
Internal
Protected internal
Независимо от значения модификатора доступа все поля доступны для всех методов того класса, в которых эти поля описаны.
Если поля доступны только для методов класса, то они называются закрытыми.
Если некоторые поля класса должны быть доступны для методов класса-потомка – protected.
Если некоторые поля должны быть доступны для методов классов, помещенных в одну сборку (assembly) с создаваемым классом – internal.
Protected internal применяется для полей, доступ к которым возможен из любого кода в сборке, в котором он объявлен, или же из классов-потомков в другой сборке.
Если некоторые поля должны быть доступны для методов любого класса, которому доступен сам создаваемый класс – public.
Модификаторы свойств:
New – новое описание поля, заменяющее унаследованное.
Static – статическое поле
Статические поля и константы существуют в единственном экземпляре для всех объектов класса
К ним обращаются не по имени экземпляра, а по имени класса.
Readonly – поле только для чтения
Поле с модификатором readonly можно изменять только при объявлении иои при вызове конструктора
Отличие от констант – конструктор можно вызывать многократно, меняя значение поля readonly.
Volatile – поле могут изменять другие процессы или потоки
Константы фактически являются статическими полями, доступными только для чтения, значения которых задаются при инициализации.
Поля класса
Когда создается новый объект класса, то он содержит полный набор всех полей класса.
Методы класса
Метод – процедура или функция, объявленная в классе.
Метод определяет поведение объектов класса
2 объекта одного класса имеют один и тот же набор методов
Синтаксис описания:
[атрибуты]
[модификаторы] ТипРезультата
Имя метода ([списокПараметров])
{
ТелоМетода
}
Модификаторы доступа
Private – по умолчанию
Закрытыя поля и методы
Public
Открытые поля и методы, задают интерфейс класса
Protected
Internal
Protected internal
Модификаторы свойств
Static(статистический)
Используется при объявлении метода, который принадлежит всему типу, а не конкретному объекту, таким образом, вызов статистических методов происходит через обращение к имени класса, а не к имени объекта.
Abstract (абстрактный)
Virtual (виртуальный)
Используется при объявлении метода, реализацию которого можно переопределить в производном классе, при переопределении используется override.
Override (переопределенный)
Sealed (запечатанный)
Используется для метода, который переопределяет виртуальный метод в базовом классе, что позволяет классам наследовать от созданного класса, но запрещает им при этом переопределять эти виртуальные методы
Extern (внешний)
Указывает на то, что объявляется метод с внешней реализацией.
Методы класса
Сигнатура метода – совокупность имени, метода, количества, типов и способов передачи параметров.
В сигнатуру не входят не имена параметров, ни тип возвращаемого значения
В классе не должно быть методов с одинаковыми сигнатурами.
Сигнатуры используются для механизма перегрузки.
Перегрузка – позволяет использовать в одном классе несколько методов с одинаковыми именами, но с разными типами параметров
Перегрузка полезна, когда требуется решать однотипные задачи с разными наборами параметров.
Пример перегрузки.
Максимум 2 целх чисел:
Int max (int a? ain b)
Максимум 3х целых чисел
Int max (int a? ain b, int c)
При вызове метода компилятор выбирает вариант метода, соответствующий типу передаваемых в метод аргументов.
Сигнатуры перегруженным методов должны отличаться.
Параметры методов
Виды параметров:
Параметры-значения – в метод передается значене переменной
Параметры-ссылки (ref) – в метод передается адрес переменной
Выходные параметры (out)
Массив параметров (params)
Переменное число аргументов
Только один и в конце списка параметров
Типы в С#:
Value types
Reference types
Void
Pointes
В метод всегда передается неявно параметр this – указатель на объект, который вызывает метод.
Параметр this нужен для идентификации конкретного экземпляра, вызвавшего метод, тк методы для всех экземпляров класса общие, а поля – разные, те чтобы метод работал с нужными полями.
Пример:
Class MyClass
{
Double y:
Public MyClass GetSelf()
{
Return this; //ссылка на объект
}
Public void SetY (double y)
{
This.y =y; . // разрешение конфликта
}
}
Специальные методы:
Конструкторы
Конструктор предназначен для инициализации объекта.
Является обязательным элементом любого класса
Конструктор вызывается автоматически при создании объекта класса с помощью операции new.
Имя конструктора совпадает с именем класса
Свойства конструкторов:
Конструктор не возвращает значение, даже void
Класс может иметь несколько конструкторов с разными параметрами
Если программист не указал ни одного конструктора или какие-то поля не были инициализированы, полям значимых типов присваивается нуль, полям ссылочных типов – значение null.
Конструктор, вызываемы без параметров, это конструктор по умолчанию.
Если в классе явно не задан ни один конструктор, то к классу автоматически добавляется конструктор по умолчанию
Если в классе явно определен один или несколько конструкторов, то автоматического добавления конструктора без аргумента…
Class MyClass
{
Public int y;
Public MyClass () // конструктор по умолчанию
{
y=1
}
Конструкторы не наследуются потомками, поэтому любой класс должен содержать собственный конструктор
Если один из конструкторов выполняет какие-то действия, а другой должен делать тоже самое + еще что-нибудь, можно вызвать первый конструктор из второго, используя ключевое слово this. Пример:
Class MyClass
{
Public int x, y;
Public MyClass (int x0)
{
X=x0;
}
Public MyClass (int x0, int y0) : this (x0)
{
Y=y0;
}
}
Статические классы могут иметь только статические конструкторы: static имя_класса ()
Статистические конструкторы: не имеют модификаторов и параметров; вызываются только автоматически.