...Ласковое дуновение ветра коснулось выдубленной солнцем и непогодой красной кожи седого индейца. Он поморщился, как будто почувствовал в воздухе что-то неприятное, и вытянув губы в трубочку начал что то насвистывать себе под нос. Белый человек сидящий напротив него поднял глаза от костра, упёрся взглядом в грубую тунику седого и задумчиво сказал
- Ты прав Бычий Хуй. Есть что то в двойном диспатче.
Бычий Хуй ничего не ответил. Смотря на пламя костра и продолжая насвистывать странную мелодию он полез за трубкой...
------------------------------------------------------
Двойной диспатч можно любить или не любить. Но ввиду особенностей работы 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
-----------------------
a
b
c
-----------------------
a
a
a
-----------------------
c
Комментариев нет:
Отправить комментарий