Simplichio
Новичок
позднее связывание?
Читаю умную, вроде, книжку "Философия Java", чтобы лучше понять принципы ООП. Но не понимаю в чем хитрость "Решение называется позднее связывание, что означает, что связывание происходит во время работы программы и основывается на типе объекта. Позднее связывание так же иногда называют динамическим связыванием или связыванием во время выполнения. Когда язык поддерживает позднее связывание, то у него должен быть механизм определения типа объекта в время работы программы и вызова соответствующего метода. Все так и есть, компилятор все еще не знает какого типа этот объект, но механизм вызова методов находит его и вызывает соответствующее тело метода" edu.krasu.ru/mod/resource/view.php?id=463
Эккель поясняет позднее связывание следующим примером, я его перевожу на PHP
Что тут требует позднего связывания, если компилятору известно - когда draw() и erase() относятся к Circle, а когда к Square.
Если я правильно понимаю, Эккель тут напутал. Вот если у меня два объекта одного типа вызывают один и тот же метод но с разной сигнатурой (с разным типом аргументов), то тогда действительно происходит позднее связывание.
Читаю умную, вроде, книжку "Философия 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();
?>
Если я правильно понимаю, Эккель тут напутал. Вот если у меня два объекта одного типа вызывают один и тот же метод но с разной сигнатурой (с разным типом аргументов), то тогда действительно происходит позднее связывание.