Характерным примером полиморфного метода является метод 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().
Троелсен Э. Язык программирования C# 2005 и платформа .NET 2.0 3-е издание.: Пер. с англ. – М.: ООО «И.Д. Вильямс», 2007. – 1168 с.: ил.
Лабор В.В. Си Шарп: Создание приложений для Windows – Мн.: Харвест, 2003.-384с.
Микелсен К. Язык программирования C#. Лекции и упражнения. Учебник: Пер. с англ./ - СПб.: ООО «ДиаСофтЮП», 2002. – 656 с.
До этого хорошо бы «Пользовательские элементы управлении» и пример с их иерархией. Шаблон Observer.