Здесь определяются три разных калькулятора: один - над целочисленными данными, другой - над данными с плавающей точкой, третий - над строковыми данными. В последнем случае определена, по сути, только операция сложения строк (конкатенации). Теперь нам нужно ввести изменения в ранее созданный класс OneLinkList. Обратите внимание на важный технологический принцип работы с объектными системами. Пусть уже есть нормально работающий класс с нормально работающими клиентами класса. Не следует изменять этот класс. Класс закрыт для изменений. Используйте наследование и открывайте класс-потомок, в который и вносите изменения, учитывающие добавляемую специфику класса. Принцип "Закрыт - Открыт" является одним из важнейших принципов построения программных систем в объектном стиле. В полном соответствии с этим принципом построим класс SumList - потомок класса OneLinkList. То, что родительский класс является универсальным, ничуть не мешает строить потомка класса, сохраняющего универсальный характер родителя. public class SumList<K, T> : OneLinkList<K, T> where K : IComparable<K> { Calc<T> calc; T sum; public SumList(Calc<T> calc) { this.calc = calc; sum = default(T); } public new void add(K key, T item) { Node<K, T> newnode = new Node<K, T>(); if (first == null) { first = newnode; cursor = newnode; newnode.key = key; newnode.item = item; sum = calc.Add(sum, item); } else { newnode.next = cursor.next; cursor.next = newnode; newnode.key = key; newnode.item = item; sum = calc.Add(sum, item); } } public T Sum() {return (sum); } }//SumList У класса добавилось поле sum, задающее сумму хранимых элементов, и поле calc - калькулятор, выполняющий вычисления. Метод add, объявленный в классе с модификатором new, скрывает родительский метод add |