позднее связывание?

Simplichio

Новичок
позднее связывание?

Читаю умную, вроде, книжку "Философия Java", чтобы лучше понять принципы ООП. Но не понимаю в чем хитрость "Решение называется позднее связывание, что означает, что связывание происходит во время работы программы и основывается на типе объекта. Позднее связывание так же иногда называют динамическим связыванием или связыванием во время выполнения. Когда язык поддерживает позднее связывание, то у него должен быть механизм определения типа объекта в время работы программы и вызова соответствующего метода. Все так и есть, компилятор все еще не знает какого типа этот объект, но механизм вызова методов находит его и вызывает соответствующее тело метода" edu.krasu.ru/mod/resource/view.php?id=463

Эккель поясняет позднее связывание следующим примером, я его перевожу на PHP
PHP:
<?php

     abstract class Shape {
         abstract public function draw();
         abstract public function erase();
     }
///////////////////////////////////////////////
    class Circle extends Shape {
    	public function draw() {
    		print "Circle draw<p>";
    	}
       public function erase(){
    	print "Circle erase<p>";
    }
}   
////////////////////////////////////////
class Square extends Shape {
    	public function draw() {
    		print "Square draw<p>";
    	}
       public function erase(){
    	print "Square erase<p>";
    }
}   
///////////////////////////////////////////
$cir = new Circle();
$sq = new Square();

$cir->draw();
$cir->erase();

$sq->draw();
$sq->erase();

?>
Что тут требует позднего связывания, если компилятору известно - когда draw() и erase() относятся к Circle, а когда к Square.
Если я правильно понимаю, Эккель тут напутал. Вот если у меня два объекта одного типа вызывают один и тот же метод но с разной сигнатурой (с разным типом аргументов), то тогда действительно происходит позднее связывание.
 

tf

крылья рулят
несовсем понял
у тебя в примере у переменных уже определены типы
еще до компиляции
 

nail

Новичок
На PHP связывание всегда позднее, зря перевел этот пример на PHP.

На самом деле там было что-то вроде:

Shape cir = new Circle();
Shape sq = new Square();

cir.draw();
cir.erase();

sq.draw();
sq.erase();

Позднее связывание означает, что cir.draw() вызовет Circle::draw(), а не Shape::draw()
 
Сверху