Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции C# Часть1 A5.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
1.07 Mб
Скачать

Метод ToString

Характерным примером полиморфного метода является метод ToString. Он определен в классе Object как virtual. Поэтому в производных классах такой же метод удобно переопределять как override. Это обеспечит однотипное (полиморфное) управление Вашими объектами. Например, в классе Student его реализация может быть следующей:

public override string ToString()

{return String.Format("Student {0} has mark {1}",name,mark);}

Благодаря этому упростится реализация метода Report:

static void Report()

{ foreach (Student st in students) Console.WriteLine(st); }

Дело в том, что метод WriteLine неявно вызывает для каждого выводимого им объекта его метод ToString.

Типичные ситуации проявления полиморфизма

Сначала определим примитивные классы:

class A

{ public virtual void Do() { Console.Write("A works "); } }

class B:A

{ public override void Do() { Console.Write("B works "); } }

Присваивание

A w1 = new B(); w1.Do();

Параметры метода

static void HardWork(A worker)

{ worker.Do(); worker.Do();

Console.WriteLine("Help!");

worker.Do(); worker.Do();

}

Затем в Main:

HardWork(new B());

Результат:

B works B works Help! B works B works

Таким образом, метод HardWork успешно сочетает два вида действий:

- действия, независимые от типа передаваемого параметра (“Help!”);

- действия, полиморфно зависимые от типа передаваемого параметра.

Абстрактные классы и полиморфизм

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

Другая особенность абстрактных классов – наличие в них абстрактных методов. Такие методы имеют две синтаксические особенности:

1. В заголовке абстрактного метода указывается ключевое слово abstract.

2. Абстрактный метод не имеет реализации.

Теперь можно определить базовый класс Student следующим образом:

public abstract class Student

{ private string name;

private int mark;

public Student(string n){name=n;}

public abstract void PassExam();

public string Name { get { return name; } }

public int Mark

{ get { return mark; } set { mark = value; } }

}

Наличие абстрактного метода позволяет реализовать принудительный полиморфизм. Дело в том, что производный класс обязан реализовать абстрактный метод (иначе этот класс остается абстрактным и должен быть описан как abstract). Абстрактные методы по умолчанию считаются описанными как virtual (указывать virtual даже нельзя).

Хотя непосредственно нельзя создавать объекты абстрактных классов, конструктор в абстрактном классе может быть определен для создания объектов производных классов, где он будет вызываться в соответствующем конструкторе с помощью конструкции base().

Литература

  1. Троелсен Э. Язык программирования C# 2005 и платформа .NET 2.0 3-е издание.: Пер. с англ. – М.: ООО «И.Д. Вильямс», 2007. – 1168 с.: ил.

  2. Лабор В.В. Си Шарп: Создание приложений для Windows – Мн.: Харвест, 2003.-384с.

  3. Микелсен К. Язык программирования C#. Лекции и упражнения. Учебник: Пер. с англ./ - СПб.: ООО «ДиаСофтЮП», 2002. – 656 с.

До этого хорошо бы «Пользовательские элементы управлении» и пример с их иерархией. Шаблон Observer.