LoveRead.info » Книги » Разная литература » Интернет-журнал "Домашняя лаборатория", 2007 №9 - Журнал «Домашняя лаборатория»

Интернет-журнал "Домашняя лаборатория", 2007 №9 - Журнал «Домашняя лаборатория»

Книгу Интернет-журнал "Домашняя лаборатория", 2007 №9 - Журнал «Домашняя лаборатория» читаем онлайн бесплатно полную версию! Чтобы начать читать не надо регистрации. Напомним, что читать онлайн вы можете не только на компьютере, но и на андроид (Android), iPhone и iPad. Приятного чтения!

301 0 18:01, 17-10-2023

Книга Интернет-журнал "Домашняя лаборатория", 2007 №9 - Журнал «Домашняя лаборатория» читать онлайн бесплатно без регистрации

Большой и увлекательный, научно-прикладной, образовательный, некоммерческий интернет-журнал, созданный группой энтузиастов. Журнал содержит материалы, найденные в Интернет или написанные для Интернет. Основная тематика статей — то, что можно сделать самому, от садовых поделок до сверхпроводников, но есть и просто полезные материалы.

    1 ... 379 380 381 382 383 384 385 386 387 ... 415
    Перейти на страницу:
    class="p1">    public override int Sub (int a, int b) { return (a — b);}

        public override int Mult(int a, int b) { return (a * b);}

        public override int Div(int a, int b) { return (a / b); }

    }

    public class DoubleCalc: Calc<double>

    {

        public override double Add(double a, double b)

            {return (a + b);}

        public override double Sub(double a, double b)

            {return (a — b);}

        public override double Mult(double a, double b)

            {return (a * b);}

        public override double Div(double a, double b)

            {return (a / b);}

    }

    public class StringCalc: Calc<string>

    {

        public override string Add(string a, string b)

            {return (a + b);}

        public override string Sub(string a, string b)

            {return (a);}

        public override string Mult(string a, string b)

            {return (a);}

        public override string Div (string a, string b)

            {return (a);}

    }

    Здесь определяются три разных калькулятора: один — над целочисленными данными, другой — над данными с плавающей точкой, третий — над строковыми данными. В последнем случае определена, по сути, только операция сложения строк (конкатенации).

    Теперь нам нужно ввести изменения в ранее созданный класс OneLinkList. Обратите внимание на важный технологический принцип работы с объектными системами. Пусть уже есть нормально работающий класс с нормально работающими клиентами класса. Не следует изменять этот класс. Класс закрыт для изменений. Используйте наследование и открывайте класс-потомок, в который и вносите изменения, учитывающие добавляемую специфику класса. Принцип "Закрыт — Открыт" является одним из важнейших принципов построения программных систем в объектном стиле.

    В полном соответствии с этим принципом построим класс SumList — потомок класса OneLinkList. То, что родительский класс является универсальным, ничуть не мешает строить потомка класса, сохраняющего универсальный характер родителя.

    public class SumList<K, Т>: OneLinkList<K, Т> where К:

        IComparable<K>

    {

        Calc<T> calc;

        T s um;

        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, задавая собственную реализацию этого метода. Родительский метод можно было бы определить как виртуальный, переопределив его у потомка, но я не стал трогать код родительского класса. К классу добавился еще один запрос, возвращающий значение поля sum.

    Некоторые изменения в уже существующем проекте пришлось-таки сделать, изменив статус доступа у полей. А все потому, что в целях экономии текста кода я не стал закрывать поля и вводить, как положено, открытые процедуры-свойства для закрытых полей.

    Проведем теперь эксперименты с новыми вариантами списков, допускающих суммирование элементов:

    public void TestSum()

    {

        SumList<string, int> list1 =

            new SumList<string, int>(new IntCalc());

        list1.add("Петр", 33); list1.add("Павел", 44);

        Console.WriteLine("sum= {0}", list1.Sum());

        SumList<string, double> list2 =

            new SumList<string, double> (new DoubleCalc());

        list2.add("Петр", 33.33); list2.add("Павел", 44.44);

        Console.WriteLine("sum= {0}", list2.Sum());

        SumList<string, string> list3 =

            new SumList<string, string> (new StringCalc());

        list3.add("Мама", " Мама мыла "); list3.add("Маша",

            "Машу мылом!");

        Console.WriteLine("sum= {0}", list3.Sum ());

    }

    Обратите внимание на создание списков:

    SumList<string, int> list1 =

        new SumList<string, int>(new IntCalc());

    SumList<string, double> list2 =

        new SumList<string, double>(new DoubleCalc());

    SumList<string, string> list3 =

        new SumList<string, string>(new StringCalc());

    Как видите, конструктору объекта передается калькулятор, согласованный с типами данных, которые хранятся в списке. Результаты вычислений, полученных при работе с этими списками, приведены на рис. 22.6.

    Рис. 22.6. Списки с суммированием

    Родовое порождение класса. Предложение using

    До сих пор рассматривалась ситуация родового порождения экземпляров универсального класса. Фактические типы задавались в момент создания экземпляра. Это наглядно показывает преимущества применяемой технологии, поскольку очевидно, что не создается дублирующий код для каждого класса, порожденного универсальным классом. И все-таки остается естественный вопрос: можно ли породить класс из универсального класса путем подстановки фактических параметров, а потом спокойно использовать этот класс обычным образом? Такая вещь возможна. Это можно сделать не совсем обычным путем — не в программном коде, а в предложении using, назначение которого и состоит в выполнении подобных подстановок.

    Давайте вернемся к универсальному классу OneLinkstack<T>, введенному в начале этой лекции, и породим на его основе вполне конкретный класс IntStack, заменив формальный параметр T фактическим — int. Для этого достаточно задать следующее предложение using;

    using IntStack = Generic.OneLinkStack<int>;

    Вот тест, в котором создаются несколько объектов этого класса:

    public void TestlntStack ()

    {

        IntStack stack1 = new IntStack ();

        IntStack stack2 = new IntStack ();

        IntStack stack3 = new IntStack ();

        stack2.put (11); stackl.put (22);

        int x1 = stack1.item(), x2 = stack1.item();

        if ((x1 == x2) && (xl == 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 (55); stack2.put (66);

        stack2.remove(); int s = stack2.item();

        if (!stack2.empty()) Console.WriteLine(s);

        stack3.put (33 3); stack3.put((int)Math.Sqrt(Math.PI));

        int res = stack3.item();

        stack3.remove(); res += stack3.item();

        Console.WriteLine("res= {0}", res);

    }

    Все

    1 ... 379 380 381 382 383 384 385 386 387 ... 415
    Перейти на страницу:
    1. Жалоба
    Отзывы - 0

    Прочитали книгу? Предлагаем вам поделится своим отзывом от прочитанного(прослушанного)! Ваш отзыв будет полезен читателям, которые еще только собираются познакомиться с произведением.


    Уважаемые читатели, слушатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

    • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
    • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
    • 3. Просьба отказаться от нецензурной лексики.
    • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

    Надеемся на Ваше понимание и благоразумие. С уважением, администратор LoveRead.info.


    Установить VPN и читай слушай бесплатно

    Новые отзывы

    1. Валентина Валентина04 июль 13:25 Большое спасибо за интересную тему.  Сюжет заманчиввй,интересный. Жду продолжения ... Лекарь Фамильяров. Том 7 - Александр Лиманский
    2. Наталья По Наталья По01 июль 10:12 Ужасный перевод:(... Аркадия - Эрин Дум
    3. Вика Вика29 июнь 21:56 Какая хрень с первых строк.  У ребенка в 14 месяце не может быть черепно мозговой травмы при падании с дивана ... Вернуть семью любой ценой - Чарли Ви
    Все комметарии
    Новинки бесплатной онлайн библиотеки