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
droslaw
post
Post #2





Grupa: Zarejestrowani
Postów: 98
Pomógł: 33
Dołączył: 10.05.2011
Skąd: Krak

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


W przykładzie, który podałeś klasy są identyczne dlatego nie ma sensu ich rozbijać na dwie. Jeśli część metod byłaby wspólna (dokładnie takie same metody łącznie z implementacją), wtedy te metody mogłyby być w klasie nadrzędnej, a w klasach pochodnych umieściłbyś różnice.

W twoim przypadku powinna to być jedna klasa. Czy interfejs byłby tam przydatny to zależy. Można by napisać więcej gdybyśmy znali szerszy kontekst, jaką aplikację piszesz i jak obiekty tej klasy są używane.
Go to the top of the page
+Quote Post
trzczy
post
Post #3





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

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


Cytat(droslaw @ 12.12.2015, 14:43:14 ) *
W przykładzie, który podałeś klasy są identyczne dlatego nie ma sensu ich rozbijać na dwie.

No rzeczywiście.

Kontekst mojego pytania jest taki, że czytam sobie tutorial o design patterns i tam napotkałem na takie "zażądanie" metod w klasie abstrakcyjnej, po czym w klasach dziedziczących zastosowane identyczne metody.

Pomyślałem, że te identyczne metody mogłyby być jedynie dziedziczone z klasy abstrakcyjnej, a nie deklarowane w każdej klasie konkretnej. (Tu w przykładzie zastosowałem interface, a nie klasę abstrakcyjną, co w sumie byłoby chyba analogią). Link do tutoriala: https://wwphp-fb.github.io/faq/object-orien...stract-factory/

Definicja klasy abstrakcyjnej wygląda tak:
  1. abstract class AbstractBook {
  2. abstract function getAuthor();
  3. abstract function getTitle();
  4. }


Cały kod tak:
  1. <?php
  2.  
  3. /*
  4.  * BookFactory classes
  5.  */
  6. abstract class AbstractBookFactory {
  7. abstract function makePHPBook();
  8. abstract function makeMySQLBook();
  9. }
  10.  
  11. class OReillyBookFactory extends AbstractBookFactory {
  12. private $context = "OReilly";
  13. function makePHPBook() {
  14. return new OReillyPHPBook;
  15. }
  16. function makeMySQLBook() {
  17. return new OReillyMySQLBook;
  18. }
  19. }
  20.  
  21. class SamsBookFactory extends AbstractBookFactory {
  22. private $context = "Sams";
  23. function makePHPBook() {
  24. return new SamsPHPBook;
  25. }
  26. function makeMySQLBook() {
  27. return new SamsMySQLBook;
  28. }
  29. }
  30.  
  31. /*
  32.  * Book classes
  33.  */
  34. abstract class AbstractBook {
  35. abstract function getAuthor();
  36. abstract function getTitle();
  37. }
  38.  
  39. abstract class AbstractMySQLBook extends AbstractBook {
  40. private $subject = "MySQL";
  41. }
  42.  
  43. class OReillyMySQLBook extends AbstractMySQLBook {
  44. private $author;
  45. private $title;
  46. function __construct() {
  47. $this->author = 'George Reese, Randy Jay Yarger, and Tim King';
  48. $this->title = 'Managing and Using MySQL';
  49. }
  50. function getAuthor() {
  51. return $this->author;
  52. }
  53. function getTitle() {
  54. return $this->title;
  55. }
  56. }
  57.  
  58. class SamsMySQLBook extends AbstractMySQLBook {
  59. private $author;
  60. private $title;
  61. function __construct() {
  62. $this->author = 'Paul Dubois';
  63. $this->title = 'MySQL, 3rd Edition';
  64. }
  65. function getAuthor() {
  66. return $this->author;
  67. }
  68. function getTitle() {
  69. return $this->title;
  70. }
  71. }
  72.  
  73. abstract class AbstractPHPBook extends AbstractBook {
  74. private $subject = "PHP";
  75. }
  76.  
  77. class OReillyPHPBook extends AbstractPHPBook {
  78. private $author;
  79. private $title;
  80. private static $oddOrEven = 'odd';
  81. function __construct()
  82. {
  83. //alternate between 2 books
  84. if ('odd' == self::$oddOrEven) {
  85. $this->author = 'Rasmus Lerdorf and Kevin Tatroe';
  86. $this->title = 'Programming PHP';
  87. self::$oddOrEven = 'even';
  88. }
  89. else {
  90. $this->author = 'David Sklar and Adam Trachtenberg';
  91. $this->title = 'PHP Cookbook';
  92. self::$oddOrEven = 'odd';
  93. }
  94. }
  95. function getAuthor() {
  96. return $this->author;
  97. }
  98. function getTitle() {
  99. return $this->title;
  100. }
  101. }
  102.  
  103. class SamsPHPBook extends AbstractPHPBook {
  104. private $author;
  105. private $title;
  106. function __construct() {
  107. //alternate randomly between 2 books
  108. mt_srand((double)microtime() * 10000000);
  109. $rand_num = mt_rand(0, 1);
  110.  
  111. if (1 > $rand_num) {
  112. $this->author = 'George Schlossnagle';
  113. $this->title = 'Advanced PHP Programming';
  114. }
  115. else {
  116. $this->author = 'Christian Wenz';
  117. $this->title = 'PHP Phrasebook';
  118. }
  119. }
  120. function getAuthor() {
  121. return $this->author;
  122. }
  123. function getTitle() {
  124. return $this->title;
  125. }
  126. }


Ten post edytował trzczy 12.12.2015, 15:33:46
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:27