вторник, 31 августа 2010 г.

Двойной диспатч как средство борьбы с неопределённостью типов при компиляции

-----------------------------------------------------
...Ласковое дуновение ветра коснулось выдубленной солнцем и непогодой красной кожи седого индейца. Он поморщился, как будто почувствовал в воздухе что-то неприятное,  и вытянув губы в трубочку начал что то насвистывать себе под нос. Белый человек сидящий напротив него поднял глаза от костра,  упёрся взглядом в грубую тунику седого и задумчиво сказал
- Ты прав Бычий Хуй. Есть что то в двойном диспатче.
Бычий Хуй ничего не ответил. Смотря на пламя костра и продолжая насвистывать странную мелодию он полез за трубкой...
------------------------------------------------------

Двойной диспатч можно любить или не любить. Но ввиду особенностей работы c Java, есть несколько ситуаций, когда без него просто не обойтись. Например когда класс, параметризующий вызов метода, неизвестен при компиляции.

Пример:


    

    import org.junit.Test;

    public class TestABC {

        static class A {
        }
       static class B extends A {
       }
       static class C extends A {
           void print(ABC abc) {
               abc.print(this);
           }
       }
       static class ABC {
           void print(A a) {
               System.out.println("a");
           }   

           void print(B b) {
               System.out.println("b");
           }

           void print(C c) {
               System.out.println("c");
           }
       }


       @Test
       public void test() {

           ABC abc = new ABC();

           A a = new A();

           B b = new B();

           C c = new C();

           //----------------------

           System.out.println("-----------------------");

           abc.print(a);
           abc.print(b);
           abc.print(c);
           //-----------------------

           System.out.println("-----------------------");
            //будет вызван только метод void print(A a) 

           abc.print(a);
           abc.print((A) b);
           abc.print((A) c);

           //-----------------------

           System.out.println("-----------------------");

           ((A)c).print(abc);//вот он красавец - двойной диспатч
       }

   }

   


Вывод:


-----------------------
a
b
c
-----------------------
a
a
a
-----------------------
c






понедельник, 2 августа 2010 г.

Хроники поджаривающегося москвича

27 июля.  В ашане смели всё что крутится и дует. Даже обогреватели.

28 июля.  Мотоцикл админа в течение дня плавно погружался подножкой в асфальт... Чтобы
               избежать окончательного всасывания тс, весом админа единым, в качестве подставки в
               асфальт был погружён старый винт.

29 июля.    Спать под мокрой простынёй не вариант. Высыхает. Пододеяльник держится дольше.

1 августа.   В ночь с пятницы на субботу было зарегистрировано N^3 очагов возгарания. С чего   
                 бы это?

2 августа. Хорошо дымит! Курильщики в шоколаде. АдОптированный к дыму организм         
                 успешно справляется с детским дымом торфяников. А ещё говорят курить вредно.

3 августа. Днём в метро просто замечательно. Прохладно и дымом не пахнет. Прохладно 
                конечно относительно.  И дымом тоже не пахнет относительно.  А ещё относительно  
                много свободных мест - относительно много граждан предпочитают стоять, потому что    
               так относительно лучше обдувает. Всё относительно.

4 августа.  Яндекс пожары показывают только один пожар близь Москвы. Врут.

5 августа.  Гугл читает мысли. Так сильно и далеко  мне хотелось быть от этого сайлентхила что 
                 утром гугл мапс спозиционировал меня в районе Красного Села под Питером.

6 августа.  Знакомая из Анголы сказала, что у них так жарко не бывает.

9.августа.  На выходные ездили с корешами на шашлыки. В Питер. Просто ехали пока не кончился дым. А
               там уже и до финского залива всего ничего осталось. В Питере не забыл заехать в торговый  
               центр и купить респираторов мешок.