Основы программирования на C#


Стек. От абстрактного, универсального класса к конкретным версиям - часть 3


public override void remove() { top--; } public override T item() { return (stack[top-1]); } public override bool empty() { return (top == 0); } }//class ArrayUpStack

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

public void TestStacks() { OneLinkStack<int> stack1 = new OneLinkStack<int>(); OneLinkStack<string> stack2 = new OneLinkStack<string>(); ArrayUpStack<double> stack3 = new ArrayUpStack <double>(10); stack1.put(11); stack1.put(22); int x1 = stack1.item(), x2 = stack1.item(); if ((x1 == x2) && (x1 == 22)) Console.WriteLine("OK!"); stack1.remove(); x2 = stack1.item(); if ((x1 != x2) && (x2 == 11)) Console.WriteLine("OK!"); stack1.remove(); x2 = (stack1.empty())? 77 : stack1.item(); if ((x1 != x2) && (x2 == 77)) Console.WriteLine("OK!"); stack2.put("first"); stack2.put("second"); stack2.remove(); string s = stack2.item(); if (!stack2.empty()) Console.WriteLine(s); stack3.put(3.33); stack3.put(Math.Sqrt(Math.PI)); double res = stack3.item(); stack3.remove(); res += stack3.item(); Console.WriteLine("res= {0}", res); }

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

Три разных стека, порожденных абстрактным универсальным классом

Рис. 22.3.  Три разных стека, порожденных абстрактным универсальным классом

Дополним наше рассмотрение еще одним примером работы с вариацией стеков, в том числе хранящим объекты класса Person:

public void TestPerson() { OneLinkStack<int> stack1 = new OneLinkStack<int>(); OneLinkStack<string> stack2 = new OneLinkStack<string>(); ArrayUpStack<double> stack3 = new ArrayUpStack <double>(10); ArrayUpStack<Person> stack4 = new ArrayUpStack<Person>(7); stack2.put("Петров"); stack2.put("Васильев"); stack2.put("Шустов"); stack1.put(27); stack1.put(45); stack1.put(53); stack3.put(21550.5); stack3.put(12345.7); stack3.put(32458.8); stack4.put(new Person(stack2.item(), stack1.item(), stack3.item())); stack1.remove(); stack2.remove(); stack3.remove(); stack4.put(new Person(stack2.item(), stack1.item(), stack3.item())); stack1.remove(); stack2.remove(); stack3.remove(); stack4.put(new Person(stack2.item(), stack1.item(), stack3.item())); Person pers = stack4.item(); pers.PrintPerson(); stack4.remove(); pers = stack4.item(); pers.PrintPerson(); stack4.remove(); pers = stack4.item(); pers.PrintPerson(); stack4.remove(); if (stack4.empty()) Console.WriteLine("OK!"); }

Результаты работы этой процедуры приведены на рис. 22.4.

Работа со стеками

Рис. 22.4.  Работа со стеками




Начало  Назад  Вперед



Книжный магазин