Работа с массивом объектов базового класса Figure
//В Main():
Figure[ ] mas = new Figure[4];
//mas[0] – ссылка на объект базового класса:
mas[0] = new Figure(15, 73);
//mas[1] – ссылка на объект базового класса и т.д.:
mas[1] = new Triangle(3, 4, 5);
mas[2] = new Rectangle(10, 7);
mas[3] = new Kwadrat(18);
for (int i = 0; i < mas.Length; i++)
Console.WriteLine("Площадь фигуры с номером "+i+"="+mas[i].area());
Здесь конкретный тип объекта (mas[i]) определяется во время работы цикла – динамический полиморфизм.
Задание: Самостоятельно разработать класс Circle и в нём переопределить методы area() и perimetr().
Абстрактные классы
Иногда создают базовый класс, определяющий своего рода пустой бланк. Производные классы этого базового класса должны заполнять «бланк» своей информацией. Такой класс не обеспечивает реализацию одного или нескольких методов. Он просто заявляет о том, что будет метод с таким-то интерфейсом. Производные классы нужно заставить переопределять такие, не имеющие никакого смысла, методы. Для этого и служат абстрактные методы.
Формат записи абстрактного метода:
public abstract Тип_возвращаемого_значения Имя_метода(Список параметров);
Абстрактный метод не содержит тело и, следовательно, не реализуется базовым классом, поэтому производный класс должен его переопределить. Абстрактный метод автоматически является виртуальным, поэтому слово virtual в его заголовке писать не надо.
Примечание 1: Модификатор abstract используется только для обычных методов, а не для static-методов.
Примечание 2: Свойства так же могут быть абстрактными.
Примечание 3: Класс, содержащий один или несколько абстрактных методов, должен быть объявлен как абстрактный:
abstract class My_Class
{
//тело класса
}
Примечание 4:Нельзя создавать объекты абстрактного класса, так как он полностью нереализуем.
Примечание 5: Можно объявить класс со словом abstract, а его некоторые методы объявить не абстрактными, а виртуальными. Такой подход более гибкий, так как производные классы могут не переопределять виртуальные методы.
Задание: В проекте «Наследование» класс Figure объявить как абстрактный и выполнить проект. Произойдёт ошибка, так как в массиве объектов имеется объект класса Figure (mas[0]),а его нельзя создавать.
abstract class Figure
{
//методы/свойства
}
Класс System.Object. Переопределение некоторых его методов
В С# класс System.Object является неявным базовым классом для всех других классов, включая встроенные типы. Это значит, что переменная типа оbject может указывать на объект любого типа. В этом классе имеется метод Equals(…), который определяет, являются ли ссылки двух сравниваемых объектов одинаковыми. Если в пользовательском классе, например в Point, перегружены операции == и !=, то нужно обязательно переопределять метод Equals(…).
Задание: В классе Point проекта «Планиметрия» переопределить метод Equals(…).
рublic override bool Equals(object Ob)
{
if (Obj==null || !Ob is Point)
//Если ссылка нулевая или Оb не является объектом класса Point
return false;
else
return
this == (Point)Ob; /*сравнение ссылок на ==объекта, вызывающего метод и объекта-параметра Ob. Но параметр Ob имеет тип оbject, значит его нужно явно привести к типу Point. */
}
В классе Оbject имеется метод ToString(), который возвращает строку, описывающую объект. Он автоматически вызывается при выводе объекта на экран с помощью метода WriteLine(). Если в пользовательском классе переопределен метод Equals(…), то нужно переопределить и метод GetHashCode(). Роль этого метода – возвратить длинное целое число, которое идентифицирует объект в оперативной памяти.
Длинное целое число нужно превратить в строку. Метод ToString() класса Object часто применяют при выводе значений на экран с помощью метода WriteLine().
Задание: В классе Point проекта «Планиметрия» переопределить метод GetHashCode().
//В классе Point:
рublic override bool GetHashCode()
{
return ToString().GetHashCode();
}
//В Main():
if (T1==T2)
ConsoleWriteLine( “Точки равны”)
else
ConsoleWriteLine( “Точки не равны”);
ConsoleWriteLine( “Хеш-код точки T1=”+T1. GetHashCode());
ConsoleWriteLine( “Хеш-код точки T2=”+T2. GetHashCode());