Опубликован: 19.08.2004 | Уровень: для всех | Доступ: платный | ВУЗ: Национальный исследовательский ядерный университет «МИФИ»
Самостоятельная работа 3:

Полиморфные методы

< Лекция 10 || Самостоятельная работа 3 || Лекция 11 >
Аннотация: Цель: Ознакомление с особенностями создания и применения полиморфных методов в языке программирования C#.

Теоретические сведения

Концепция полиморфизма

Понятие полиморфизма является одной из фундаментальных составляющих объектно-ориентированного программирования и позволяет определять в наследуемом классе методы, которые являются общими для всех наследующих классов. При этом наследующий класс может определять специфическую реализацию для некоторых (а возможно и всех) полиморфных методов. Важнейший принцип полиморфизма можно сформулировать фразой: "один интерфейс, несколько методов". Благодаря полиморфизму можно пользоваться методами, не обладая точными знаниями о типе объектов.

Основными механизмами для реализации концепции полиморфизма в ООП (в том числе, в языке C#) являются виртуальные методы и абстрактные классы.

Виртуальные методы

Метод, при определении которого в наследуемом классе было указано ключевое слово virtual и который был переопределен в одном или более наследующих классах, называется виртуальным методом. Следовательно, каждый наследующий класс может иметь собственную конкретизацию виртуального метода.

Выбор конкретизации виртуального метода, которая будет использована, осуществляется в соответствии с типом объекта, на который указывает ссылочная переменная во время выполнения программы. Другими словами, именно тип объекта, на который указывает ссылка (а не тип ссылочной переменной), определяет вызываемую версию виртуального метода. Таким образом, если класс содержит виртуальный метод и от этого класса были унаследованы другие классы, в которых определены свои версии метода, при ссылке переменной типа наследуемого класса на различные типы объектов вызываются различные версии виртуального метода.

При определении виртуального метода в составе наследуемого класса перед типом возвращаемого значения указывается ключевое слово virtual, а при переопределении виртуального метода в наследующем классе используется модификатор override. В определении виртуального метода недопустимо использование модификаторов static и abstract.

Виртуальный метод не обязательно должен быть переопределенным ( overridden ). Если наследующий класс не предоставляет собственную версию виртуального метода, то используется метод наследуемого класса.

Переопределение метода положено в основу концепции динамического выбора вызываемого метода. Выбор вызываемого переопределенного метода осуществляется во время выполнения программы, а не во время ее компиляции.

Описание абстрактного метода

Синтаксис:

virtual тип имя (список_параметров)
    {тело_метода};

Абстрактные классы

В абстрактном классе определяются лишь общие предназначения методов, которые должны быть реализованы в наследующих классах. Сам по себе абстрактный класс не содержит таких методов, называемых абстрактными (для них определены только отдельные характеристики, в частности, тип возвращаемого значения, имя и список параметров).

Для объявления абстрактного метода используется модификатор abstract. Поскольку абстрактный метод неявно является виртуальным, модификатор virtual при объявлении такого метода не используется.

Абстрактные классы предназначены исключительно для создания иерархии классов, поэтому запрещено создание объектов абстрактного класса.

Описание абстрактного класса

Синтаксис:

abstract class имя {тело_класса};

Пример:

abstract class Animal
{
  public string Name;
  protected int Weight;
  private int Type;
  abstract void Feed();
  public int Animal(int W, int T, string N)
  {
        Weight=W;
        Type=T;
        Name=N;
  }
  public int GetWeight(){
        return Weight;
  }
}
class Predator:Animal
{
  private int Speed;
  override void Feed(int Food){
        Weight += Food;
  }
}

Порядок выполнения работы

  1. Изменить иерархию классов и реализовать ее на С#.
  2. Показать на примере одного из методов, присутствующих в каждом классе, свойство полиморфизма.

Варианты заданий

Расширить иерархию классов из лабораторной работы №7 с использованием виртуального класса в качестве основы иерархии. Показать пример использования полиморфизма методов.

< Лекция 10 || Самостоятельная работа 3 || Лекция 11 >