Виртуальные методы
Метод, при определении которого в наследуемом классе было указано слово virtual, и который был переопределен в одном или более наследующих классах, называется виртуальным методом. Следовательно, каждый наследующий класс может иметь собственную конкретизацию виртуального метода.
Выбор конкретизации виртуального метода, который будет использован, осуществляется в соответствии с типом объекта, на который указывает ссылочная переменная во время выполнения программы. Другими словами, именно тип объекта, на который указывает ссылка (а не тип ссылочной переменной), определят вызываемую версию виртуального метода. Таким образом, если класс содержит виртуальный метод и от этого класса были наследованы другие классы, в которых определены свои версии метода, при ссылке переменной типа наследуемого класса на различные типы объектов вызываются различные версии виртуального метода.
При определении виртуального метода в составе наследуемого класса перед типом возвращаемого значения указывается ключевое слово virtual, а при переопределении виртуального метода в наследующем классе применяется модификатор override. В определении виртуального метода недопустимо использование модификатора static и abstract.
Виртуальный метод не обязательно должен быть переопределенным (overriden). Если наследующий класс не представляет собственную версию виртуального метода, то применяется метод наследуемого класса.
Переопределение метода положено в основу концепции динамического выбора вызываемого метода. Выбор вызываемого переопределенного метода осуществляется во время выполнения программы, а не во время ее компиляции.
Описание абстрактного метода:
Virtual тип имя (список_параметров){тело метода};
Абстрактные классы
В абстрактном классе определяются лишь общие предназначения методов, которые должны быть реализованы в наследующих классах. Сам по себе абстрактный класс не содержит таких методов, называемых абстрактными (для них определены только отдельные характеристики, в частности тип возвращаемого значения, имя и список параметров).
Для объявления абстрактного метода используется модификатор abstract. Поскольку абстрактный метод неявно является виртуальным, модификатор virtual при объявлении такого метода не используется.
Абстрактные классы предназначены исключительно для создания иерархии классов, поэтому запрещено создание объектов абстрактного класса.
Описание абстрактного класса:
Синтаксис:
abstract class имя {тело класса};
Пример:
abstract class Animal
{
Public string name;
Protected int Weigth;
Private int Type;
Abstract void Feed();
Public int Animal(int W, int T, string N)
{
Weigth=W;
Type=T;
Name=N;
}
Public int GetWeigth(){return Weigth;}
}
class Predator:Animal
{
Private int Speed;
Override void Feed(int Food){
Weigth+=Food;}
}
Контрольные вопросы
Что понимается под термином «полиморфизм»?
Что понимается под термином «абстрактный класс»?
Что понимается под термином «виртуальный метод»?
В чем состоит основной принцип полиморфизма?
Какие механизмы используются в языке C# для реализации концепции полиморфизма?
Каким ключевым словом языка C# описывается виртуальный метод?
Какими условиями определяется выбор версии виртуального метода?
Какое ключевое слово (модификатор) языка C# используется для определения виртуального метода в базовом (родительском) классе?
Какое ключевое слово (модификатор) языка C# используется для определения виртуального метода в производном (дочернем) классе?
Какое ключевое слово (модификатор) языка C# используется для определения абстрактного метода?
Какое ключевое слово (модификатор) языка C# не используется для определения абстрактного метода?
Какие ключевые слова недопустимы при определении виртуальных методов?
В чем состоит особенность использования виртуальных методов в производных (дочерних) классах?
На каком этапе трансляции программы осуществляется выбор версии виртуального метода?
Какую концепцию реализует неопределенный метод?
На каком этапе трансляции осуществляется выбор вызываемого переопределенного метода?
Возможно ли создание иерархи классов посредством абстрактного класса?
Возможно ли создание объектов абстрактного класса?
Варианты заданий
Расширить иерархию классов из лабораторной работы № 4 с использованием виртуального класса в качестве основы иерархии. Показать пример использования полиморфизма методов.
Порядок выполнения работы:
1) Изменить иерархию классов и реализовать ее на C#.
2) Показать на примере одного из методов, присутствующих в каждом классе, свойство полиморфизма.
3) Подготовить отчет в твердой копии и в электронном виде.
Расширенные возможности языка программирования C#
Цель работы:
Ознакомление с расширенными возможностями языка программирования C (интерфейсы и делегаты).
Необходимые теоретические сведения:
Интерфейсы
В языке программирования C# с целью изоляции описательной части класса от его реализации используется механизм интерфейсов.
Понятие интерфейса является расширением идеи абстрактных классов и методов. Синтаксис интерфейсов подобен синтаксису абстрактных классов. Объявление интерфейсов осуществляется с помощью ключевого слова interface. При этом методы интерфейса не поддерживают реализации.
Членами интерфейса могут быть методы, свойства, индексаторы и события.
Интерфейс может реализовываться произвольным количеством классов. Один класс, в свою очередь, может реализовать любое число интерфейсов.
Каждый класс, включающий интерфейс, должен реализовывать его методы. В интерфейсе для методов неявным образом присутствует модификатор типа public. При этом явное указание модификатора доступа недопустимо.
