- •Классы. Создание экземпляров класса. Особенности перегрузки конструкторов
- •Классы: особенности инициализации полей, поля const и readonly
- •Статические элементы класса. Статический конструктор.
- •Индексаторы
- •Механизмы наследования. Объявление наследования.
- •Конструкторы производных и базовых классов. Использование ключевого слова base.
- •Скрытие наследуемых элементов.
- •Переопределение наследуемых элементов.
- •Полиморфное поведение производных классов.
- •Абстрактные методы и классы.
- •Интерфейсы. Операции is и as.
- •Разработка и использование интерфейсов.
- •Делегаты.
- •События. Правила использования стандартных делегатов.
Индексаторы
Индексатор - это разновидность свойства, с помощью которого для объекта пользовательского классного типа можно перегрузить операцию «квадратные скобки». В стандартном случае пользовательский тип содержит
набор элементов, доступ к каждому из которых оказывается возможным по индексу.
Индексатор позволяет обеспечить индексированный доступ к объекту. Главное назначение индексаторов — поддержать создание специализированных массивов, на которые налагается одно или несколько ограничений. Индексаторы могут характеризоваться одной или несколькими размерностями.
тип_элемента this[int индекс]
{// Модификатор доступа считывания данных,
get {// Возврат значения, заданного элементом индекс}
// Модификатор доступа установки данных,
set {// Установка значения, заданного элементом индекс} }
Пример:
namespace Индексатор
{class Array
{int[] arr; int Len;
public Array(int len)
{arr = new int[Len=len];}
public int this[int а]
{set { if (а < Len)arr[а] = value; }
get { if (а < Len)return arr[а]; else return 0; } } }
class Program
{ static void Main()
{ Array mass = new Array(3);
for (int i = 0; i < 5; i++)
{mass[i] = 2;
Console.WriteLine("mass[{0}] = {1} ",i, mass[i]);} } } }
На экране: mass[0] = 2
mass[1] = 2
mass[2] = 2
mass[3] = 0
mass[4] = 0
Механизмы наследования. Объявление наследования.
Допустим, что у нас есть некоторый класс, который почти подходит для нашей конкретной задачи. Почти, но не совсем. Что-то (некоторые методы) в этом классе надо изменить, что-то - добавить. Наследование как раз и служит для этого. При наследовании мы объявляем наш класс потомком другого класса. И наш класс-потомок автоматически приобретает всё, что было в родительском классе. Это мы делаем буквально парой строчек. Затем в дочерний класс мы можем что-нибудь добавить (чего не было в классе родительском). Кроме того, в дочернем классе мы можем что-нибудь из родительского класса переопределить - так что оно уже будет работать по-другому.
При этом выделяется пара классов: Базовый, Производный.
Производный класс наследует (получает в распоряжение) все элементы базового класса, кроме констр и дестр. Режимы защиты элементов класса устанавливают спецификаторы
доступа:
public - общедоступный элемент класса (не распространяется режим защиты). Данные элементы доступны в любом месте области видимости объекта класса;
protected - защищенный элемент. Данные элементы доступны только в самом классе (собственным элементам) и в производном классе. Спецификатора protected в структурах не было – так как структурные типы не поддерживают
наследования;
private - частный элемент. Данные элементы доступны только в самом классе.
Наследование всегда объявляется со стороны производного класса, поэтому к моменту объявления производного, базовый класс должен быть уже объявлен.
Оператор объявления производного класса имеет следующий состав:
сlass ИмяПроизводКласса : ИмяБазовогоКласса{<тег производ класса>};
using System;
namespace test
{ class Worker
{ protected int age=0;
public void setAge(int age)
{if(age>0 && age<100) this.age=age;
else this.age=0; }
public int getAge()
{ return age; } }
class Boss : Worker{
public int numOfWorkers; //Кол.подчиненных
public new void setAge(int age)
{ if(age>0 && age<45) this.age=age;
else this.age=0; } }
class Test
{ static void Main(string[] args)
{ Worker wrk1 = new Worker(); Boss boss = new Boss();
wrk1.setAge(50); boss.setAge(50); boss.numOfWorkers=4;
Console.WriteLine("Возраст работника "+wrk1.getAge());
Console.WriteLine("Возраст босса "+boss.getAge());
Console.WriteLine("Количество подчиненных "+boss.numOfWorkers); } } }
50 0 4