Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Абстрактный класс
Форумы портала PHP.SU » » Вопросы новичков » Абстрактный класс

Страниц (2): [1] 2 »
 

1. Faab - 19 Февраля, 2013 - 12:53:22 - перейти к сообщению
Я так понял что вся фишка абстрактных классов в том, что бы его дочерние классы содержали все абстрактные методы родителя, с их сигнатурой. Это значит реализующий метод должен содержать в себе количество аргументов абстрактного метода. Это понятно. И далее автор пишет: далее в нём (реализующем методе) должны воспроизводиться все уточнения типов класса!

Тут я встал немного. Куда именно я должен подставлять уточнения класса, да и в примерах по абстрактным классам я не встречал такие уточнения: TestClass $test.

PHP:
скопировать код в буфер обмена
  1.  
  2. abstract public function abstractFunction(TestClass $test);
  3.  


Если тут есть что пояснить про уточнение класса, то поясните пожалуйста.
2. vanicon - 19 Февраля, 2013 - 13:04:00 - перейти к сообщению
Метод "abstractFunction" может принимать только 1 параметр, и этот параметр должен быть объектом класса TestClass.
Это означает что класс реализующий этот метод будет принимать только объекты класса TestClass и производных от него...
3. esterio - 19 Февраля, 2013 - 13:07:40 - перейти к сообщению
Вы знакомы что такое интерфейс?
Если да - то абстракный класс грубо говоря то же самое, только он может содержать реализацию.
невозможно создать екземпляр от абстракного класса.
Faab пишет:
abstract public function abstractFunction(TestClass $test);

Тут говорится что наследник должен реализировать метод abstractFunction
Faab пишет:
TestClass $test

Здесь указиваться что переменная $test должна быть екземпляром обьекта класса TestClass или же его наследником. Такое делаеться чтобы проверить тип входящей переменной
4. Faab - 19 Февраля, 2013 - 13:11:11 - перейти к сообщению
Я понимаю так. Используя, абстрактный класс/метод в коде, можно и не делать уточнение типа класса. Но это может привести к ошибки (неверный тип класса, или данных).

Поэтому желательно использовать уточнение типа класса. Только я не понял где его использовать. В примере выше я с потолка поставил его в абстрактный метод. На практике, уточнение типа класса ставят в реализующий метод?
5. Мелкий - 19 Февраля, 2013 - 13:13:22 - перейти к сообщению
Faab пишет:
я не встречал такие уточнения: TestClass $test.

Это type hinting: http://php.net/manual/en/languag....typehinting.php
Возможность возложить проверку некоторых типов данный сразу на интерпретатор. К абстрактным классам отношения явного не имеет, возможность общая для всех функций и методов.
6. Faab - 19 Февраля, 2013 - 13:15:01 - перейти к сообщению
esterio пишет:
Вы знакомы что такое интерфейс?


Нет, это следующая глава. )) Там похоже вообще дебри. Я пока хочу более менее понять про абстрактный класс и уже начать знакомство с интерфейсами.
7. esterio - 19 Февраля, 2013 - 13:19:36 - перейти к сообщению
Как то странно учить интерфейсы после абстракных классов. А что за книга. От себя могу порекомендировать к прочтению
Мэтт Зандстра - PHP. Объекты, шаблоны и методики программирования - 2011 год
8. Faab - 19 Февраля, 2013 - 13:22:02 - перейти к сообщению
esterio пишет:
Как то странно учить интерфейсы после абстракных классов. А что за книга. От себя могу порекомендировать к прочтению
Мэтт Зандстра - PHP. Объекты, шаблоны и методики программирования - 2011 год


Это она и есть. На 71 странице кончается глава об абстрактном классе и начинаются интерфейсы.
9. DelphinPRO - 19 Февраля, 2013 - 13:44:56 - перейти к сообщению
esterio пишет:
Как то странно учить интерфейсы после абстракных классов
esterio пишет:
От себя могу порекомендировать к прочтению
Мэтт Зандстра
Faab пишет:
Это она и есть.

Ха-ха сами читали книгу? Улыбка
сорри за офтопик. настроение хорошее..
10. esterio - 19 Февраля, 2013 - 14:03:07 - перейти к сообщению
DelphinPRO
Как раз читаю ее счас, только пробежался 1 главу, так как там почти вже все извесное для меня. Видимо зря Радость Радость Радость
11. Okula - 19 Февраля, 2013 - 16:58:41 - перейти к сообщению
Faab, вот тебе небольшой пример реализации абстрактного класса.
PHP:
скопировать код в буфер обмена
  1. abstract class Animals {
  2.    
  3.     protected $send;
  4.     protected $name;
  5.    
  6.     public function __construct($name) {
  7.         $this->name = $name;
  8.     }
  9.  
  10.     public function getSend() {
  11.         return $this->send;
  12.     }
  13.    
  14.     abstract public function setSend();
  15.    
  16. }
  17.  
  18. class Cat extends Animals {
  19.    
  20.     public function setSend() {
  21.         $this->send = 'Кошка '.$this->name.' говорит: "Мяу!"';
  22.         return $this;
  23.     }
  24. }
  25.  
  26. class Dog extends Animals {
  27.    
  28.     public function setSend() {
  29.         $this->send = 'Собака '.$this->name.' говорит: "Гав!"';
  30.         return $this;
  31.     }
  32. }
  33.  
  34. $cat = new Cat('Мурка');
  35. $dog = new Dog('Тузик');
  36.  
  37. echo $cat->setSend()->getSend();
  38. echo '<br>';
  39. echo $dog->setSend()->getSend();

Результат работы скрипта:
CODE (htmlphp):
скопировать код в буфер обмена
  1. Кошка Мурка говорит: "Мяу!"
  2. Собака Тузик говорит: "Гав!"
12. DeepVarvar - 19 Февраля, 2013 - 18:19:37 - перейти к сообщению
Okula пишет:
public function getSend()
E_STRICT!
13. Okula - 20 Февраля, 2013 - 09:52:06 - перейти к сообщению
DeepVarvar, у меня в примере нет ошибок типа E_STRICT.
14. Faab - 20 Февраля, 2013 - 15:38:54 - перейти к сообщению
Okula пишет:
Faab, вот тебе небольшой пример реализации абстрактного класса.


Спасибо, за пример. Чистый пример абстрактного класса. В нём мне всё понятно.

Я завис только с одной маленькой деталью: уточнением типа класса. Вы не могли бы расширить этот пример так, что бы в нём было бы желательным уточнение типа класса. Я понимаю как делать уточнение типа класса, но очень размыто понимаю "зачем и где".

Я понимаю, что всё зависит от задачи кода. Поставьте мне задачу так, пожалуйста, где без уточнения код мог бы привести к ошибке в вашем примере. Спасибо.
15. caballero - 20 Февраля, 2013 - 16:19:49 - перейти к сообщению
Шо сие такое "уточнение типа"? Уточнение кем и где?

 

Powered by ExBB FM 1.0 RC1