
- •Классы и структуры в c#. Класс Object, его методы.
- •Объявление и вызов методов класса.
- •Вызов методов:
- •Конструктор и деструктор класса.
- •Отношение наследования, объявление класса-потомка.
- •Создание экземпляров класса-потомка, взаимодействие конструкторов родителя и потомка.
- •Три способа изменения методов класса-родителя в классе-потомке.
- •Статическое и динамическое связывание
- •Полиморфизм. Три механизма реализации полиморфизма.
- •16. Абстрактные классы. Абстрактные классы
- •17. Интерфейсы, объявления интерфейсов.
- •18. Члены интерфейсов.
- •Реализация интерфейсов
18. Члены интерфейсов.
членами интерфейса, кроме объявлений методов, свойств и событий могут быть также объявления индексаторов
И нтерфейсы не могут иметь конструкторов и деструкторов, поскольку создавать экземпляры интерфейса (как и экземпляры абстрактного класса) нельзя
И нтерфейсы не могут содержать полей и констант, а также объявлений операций
К роме того, ни один член интерфейса не может быть объявлен статическим (static )
П о умолчанию интерфейс имеет модификатор доступа private
О бъявления, являющиеся членами интерфейса, не должны содержать модификаторов доступа и неявно являются общедоступными
Реализация интерфейсов
П одобно абстрактным классам интерфейсы могут выступать в роли родителей производных от них классов
В этом случае говорят, что производный класс наследует соответствующий интерфейс
Ф ормат записи класса, который наследует интерфейс, таков:
class имя_класса : имя_интерфейса
{ <тело_класса>}
К ласс, наследник интерфейса, обязан содержать реализацию всех членов интерфейса
П ри этом допускается предоставлять «пустую» реализацию (безо всякого функционального кода), если не требуется ничего делать с данным членом интерфейса
К роме того, можно реализовать члены интерфейса в виде абстрактных членов абстрактных классов
В классах, которые реализуют интерфейсы, можно определять дополнительные члены
Д обавим, например, в класс ByTwos метод getPrevious (), который возвращает предыдущее значение ряда
обавление метода getPrevious () потребовало внесения изменений в реализацию методов, определенных интерфейсом I s eries
Н о поскольку интерфейс для этих методов остается прежним, при изменении не разрушается код, написанный ранее
В этом и заключается одно из достоинств использования интерфейсов
оскольку интерфейс может реализовать любое количество классов, рассмотрим другой класс реализации интерфейса ISeries
П усть это будет класс Primes, который генерирует ряд простых чисел
Новый класс реализации
Тестирование нового класса
Х отя классы Primes и ByTwos генерируют разные ряды чисел, оба они реализуют один и тот же интерфейс Iseries
Системные интерфейсы. .Net Framework.
среде .NET Framework определено множество интерфейсов, которые могут использовать программы
Н апример, интерфейс System. IComparable определяет метод CompareTo (), который позволяет сравнивать объекты; интерфейс System.Collections. ICollection определяет функциональность, общую для всех коллекций
Интерфейс System. Collections. IEnumerator предлагает способ опроса элементов в коллекции
Массивы, объявление и инициализация одномерных массивов.
С интаксис объявления одномерного массива аналогичен синтаксису такого объявления в C++ (квадратные скобки после имени типа!):
<тип_элемента>[ ] <имя_массива> [=<инициализатор>];
Поскольку массивы реализуются как объекты, их создание состоит из двух этапов:
объявления ссылочной переменной, играющей роль имени массива;
выделения памяти для размещения указанного числа элементов
Размер массива – константное выражение целого типа
Р абота с одномерным массивом ведется обычным образом
Массивы, объявление и инициализация двумерных массивов.
интаксис объявления имеет вид:
<тип_элемента>[ , ] <имя_массива> [=<инициализатор>];
Е сли инициализатор не используется, то запрос на выделение памяти делается с помощью операции new :
new <тип_элемента> [<размер1>, <размер2>] ;
О бращение к элементу двумерного массива производится привычным способом: указывается имя массива и два индекса, разделенные запятой
Н апример:
table [ 3 , 5] = 10;
Ломаные массивы.
Д вумерные массивы – это одномерные массивы массивов, поэтому длины строк в таблице могут иметь разную длину
Т акие массивы называются ломаными (jagged) и объявляются несколько иначе:
<тип_элемента>[ ] [ ] <имя_массива> ;
З апрос памяти производится в два этапа: сначала с указанием числа строк:
<имя_массива> = new <тип_элемента> [<число_строк>] [ ] ;
атем для каждой строки делается отдельный запрос на выделение памяти:
<имя_массива> [<индекс_строки>] = new <тип_элемента> <размер_текущей_строки>] ;
О бращение к элементу ломаного массива производится способом, принятым в языке C++ : указывается имя массива и два индекса, каждый в своих квадратных скобках
Н апример:
jag [ 2 ] [ 4] = 10;
Объектные свойства массивов. Класс System Array
О бъектная реализация массивов приводит к целому ряду специфических черт массивов C#
В о-первых, имена массивов являются ссылками на соответствующие объекты, поэтому применение к ним операции присваивания не приводит к созданию нового массива
Н апример:
int[] nums 1 = new int[ 4 ] {1, 2, 3, 4};
В о-вторых, при объявлении пользователем массива «за кадром» создается класс, наследник системного класса System.Array , и экземпляр этого класса, представляющий этот массив
В соответствии с принципом наследования пользовательский массив получает доступ к методам и свойствам класса System.Array
В первую очередь стоит отметить свойство для чтения Length , позволяющее получить размер массива
Оператор foreach.
Ц икл foreach позволяет обращаться к каждому элементу в массиве с помощью простого синтаксиса:
foreach ( <базовый_тип> <имя> in <имя_массива> )
Э тот цикл будет осуществлять проход по всем элементам и помещать каждый из них по очереди в переменную <имя>
П ри этом не используется информация о количестве элементов в массиве