Введение в теорию программирования. Объектно-ориентированный подход



             

Расширенные возможности полиморфизма в языке C# - часть 2


Проиллюстрируем особенности использования механизма "запечатанных" классов следующим фрагментом программы на языке C#:

sealed class Account : Asset { long val; public void Deposit (long x) { ... } public void Withdraw (long x) { ... } ... }

Как видно из приведенного примера, фрагмент программы на языке C# представляет собой описание "запечатанного" класса Account, реализующего абстрактные методы Deposit и Withdraw для занесения средств на счет и их снятия со счета.

В ходе курса уже обсуждалась стратегия динамического связывания переменных со значениями при функциональном и объектно-ориентированном подходах.

Проиллюстрируем особенности реализации динамического связывания в языке программирования C# следующим фрагментом программы:

class A { public virtual void WhoAreYou() { Console.WriteLine("I am an A"); } }

class B : A { public override void WhoAreYou() { Console.WriteLine("I am a B"); } }

Как видно из приведенного примера, данный фрагмент программы содержит описания класса A с виртуальным методом WhoAreYou, который выводит на стандартное устройство вывода сообщение о принадлежности к классу A, а также замещенного класса B с виртуальным методом WhoAreYou, который выводит на стандартное устройство вывода сообщение о принадлежности к классу B. При таком подходе сообщение запускает метод, который динамически определяет принадлежность к классу (в приведенном ниже примере создается и идентифицируется объект класса B):

A a = new B(); a.WhoAreYou(); // "I am a B"

Заметим, что существенной особенностью рассматриваемого примера является то обстоятельство, что B - это замещенный метод.

В этой связи, каждый из методов, который способен обрабатывать A, может также обрабатывать B. Проиллюстрируем этот факт следующим фрагментом программы на языке C#:

void Use (A x) { x.WhoAreYou(); } Use(new A()); // "I am an A" Use(new B()); // "I am a B"

Как видно из приведенного фрагмента программы, применение метода Use, реализующего идентификацию объекта класса A, приводит к результату для объекта "I am an A" класса A и к результату "I am a B" для объекта класса B.Корректность получаемого результата для класса B (несмотря на детерминированное описание класса A как параметра метода Use) объясняется тем обстоятельством, что класс B является замещенным.




Содержание  Назад