Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Inheritance vs. interface dla takich samych metod., Klasy dziedziczące mają te same metody. Powinny dziedziczyć?
trzczy
post
Post #1





Grupa: Zarejestrowani
Postów: 460
Pomógł: 49
Dołączył: 5.06.2011

Ostrzeżenie: (0%)
-----


Kiedy klasy dziedziczące mają takie same metody, to lepiej by dziedziczyły te metody od klasy nadrzędnej, czy miały te metody "przykazane" przez interface i umieszczone w sobie? Takie 2 rozwiązania pokazuję poniżej. Które jest bardziej poprawne?
  1. //example 1
  2. interface Person {
  3. function getName();
  4. function setName($name);
  5. function getHobby();
  6. function setHobby($hobby);
  7. }
  8. class Person2 implements Person{
  9. private $name;
  10. private $hobby;
  11. public function getName()
  12. {
  13. return $this->name;
  14. }
  15. public function setName($name)
  16. {
  17. $this->name = $name;
  18. }
  19. public function getHobby()
  20. {
  21. return $this->hobby;
  22. }
  23. public function setHobby($hobby)
  24. {
  25. $this->hobby = $hobby;
  26. }
  27. }
  28. class Person3 implements Person{
  29. private $name;
  30. private $hobby;
  31. public function getName()
  32. {
  33. return $this->name;
  34. }
  35. public function setName($name)
  36. {
  37. $this->name = $name;
  38. }
  39. public function getHobby()
  40. {
  41. return $this->hobby;
  42. }
  43. public function setHobby($hobby)
  44. {
  45. $this->hobby = $hobby;
  46. }
  47. }
  48. //example 1 end
  49.  
  50. //example 2
  51. abstract class Human{
  52. protected $name;
  53. protected $hobby;
  54. public function getName()
  55. {
  56. return $this->name;
  57. }
  58. public function setName($name)
  59. {
  60. $this->name = $name;
  61. }
  62. public function getHobby()
  63. {
  64. return $this->hobby;
  65. }
  66. public function setHobby($hobby)
  67. {
  68. $this->hobby = $hobby;
  69. }
  70. }
  71. class Human1 extends Human{
  72. protected $name;
  73. protected $hobby;
  74. }
  75. class Human2 extends Human{
  76. protected $name;
  77. protected $hobby;
  78. }
  79. //example 2 end
  80.  
  81. //TESTING
  82. $Mark = new Person2();
  83. $Mark->setName('Mark');
  84. echo "{$Mark->getName()}<br>"; //Mark
  85. $Mark = new Human2();
  86. $Mark->setName('Mark');
  87. echo "{$Mark->getName()}<br>"; //Mark
  88.  


Z góry dziękuję
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Fred1485
post
Post #2





Grupa: Zarejestrowani
Postów: 361
Pomógł: 22
Dołączył: 10.02.2015

Ostrzeżenie: (0%)
-----


Tak moimi słowami, klasę abstrakcyjną czy interfejs piszę często po to, aby mieć pewność, że dany obiekt posiada implementację danej metody.
Przykładowo masz np. klasę abstrakcyjną Storage obsługującą zapisywanie danych, po której dziedziczą np. klasy Database, Session, File itp. Każda z nich musi mieć metodę odczytującą i zapisującą. Więc w klasie nadrzędnej Storage umieszczam dwie metody write i read. Potem gdy, inna klasa będzie musiała przyjąć obiekt danych, to w metodzie rzutuję
  1. function przyjmij(Storage $storage) {//}
I mam pewność że będę mógł odczytać i zapisać dane. Przykład taki z rękawa, może wiesz co mam na myśli.

Ten post edytował Fred1485 12.12.2015, 15:42:37
Go to the top of the page
+Quote Post

Posty w temacie
- trzczy   Inheritance vs. interface dla takich samych metod.   12.12.2015, 13:32:56
- - droslaw   W przykładzie, który podałeś klasy są identyczne d...   12.12.2015, 14:43:14
|- - trzczy   Cytat(droslaw @ 12.12.2015, 14:43:14 ...   12.12.2015, 15:32:26
- - Fred1485   Tak moimi słowami, klasę abstrakcyjną czy interfej...   12.12.2015, 15:41:38
- - Comandeer   Osobiście spotkałem się z podejściem, gdzie interf...   12.12.2015, 19:00:55
- - trzczy   Dzięki za odpowiedzi. Dla mnie wynika z tego, że n...   12.12.2015, 22:37:35
- - Damonsson   To nie jest kwestia żadnego wyboru. Do czego inneg...   13.12.2015, 00:36:28
|- - trzczy   Damonsson, nie rozumiesz pytania. Chodzi o dublowa...   13.12.2015, 01:07:19
- - viking   Ale Damansson dobrze Ci odpowiedział i według mnie...   13.12.2015, 10:42:44
|- - trzczy   Cytat(viking @ 13.12.2015, 10:42:44 )...   13.12.2015, 18:42:16
- - Comandeer   CytatW interface nie ma definicji metod. Są nazwy ...   13.12.2015, 18:53:29
- - Pyton_000   O jakim dublowaniu mówisz. Bo tutaj jedynie dublow...   13.12.2015, 19:08:52
- - droslaw   trzczy, Damansson ma rację, w tutorialu żadne meto...   13.12.2015, 22:18:07
- - trzczy   Cytat(Pyton_000 @ 13.12.2015, 19:08:5...   14.12.2015, 08:28:08
- - Pyton_000   Settery i gettery to nie problem. O ile nie mają s...   14.12.2015, 08:33:13
- - droslaw   Cytat(trzczy @ 14.12.2015, 08:28:08 )...   14.12.2015, 12:16:07
- - Matrix12   W przykładzie gdzie implementujesz interfejs chodz...   15.12.2015, 08:00:27
|- - trzczy   Jeszcze się gubię w tym branżowym słownictwie... ...   17.12.2015, 01:13:47
- - Pyton_000   Możesz nazwać jak chcesz np: StorageInterface Sto...   17.12.2015, 10:06:18
|- - trzczy   Cytat(Pyton_000 @ 17.12.2015, 10:06:1...   17.12.2015, 12:35:52
- - Pyton_000   tak, tylko weź pod uwagę to że samego Interface ni...   17.12.2015, 12:37:16
- - viking   Nie było przypadkiem w którymś PSR że interface ma...   17.12.2015, 12:50:28
- - Pyton_000   Było https://github.com/php-fig/fig-standards/bl...   17.12.2015, 14:01:21


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 27.12.2025 - 11:01