dakata__92
Super Moderator
pix3l каза:Наследяването не е задължително, но е препоръчително да се използва, когато има очевидна връзка между класовете и единия може да допълни другия.
Имам един въпрос: За какво служат празните интерфейси?
Те са полезни точно толкова, колкото и тези, в които имаш методи, които трябва да се имплементират.
Чакай първо да се уточним. С твоят код ти обясняваш полиморфизъм. Взаимствано от твоят коментар, промених минимално кодат ти за да обясня шаблона фабрика. Нека разграничим първо двете обяснения. Ти наследяваш структурата, аз пък задължавам кода да съдържа метода с дадено име.
За теб класът Animal бива наследяван от подкласовете на Lion, Snake и Еagle и всеки изпълнява метода move. За целта ти правиш инстанция на класовете и един по един ги подаваш, като обекти на тестовият клас, и те стават параметри на метода move. Те задължително трябва да са от наследствената структура на Animal.
Аз имам интерфейс Анимал задължаващ класовете Lion, Snake и Еagle, които го имплементират, да съдържат в себе си метод с наименованието move. При мен се прави инстанция единствено на Тестовият клас и на него подавам имената (string) на класовете, като параметри на метода move. В този метод се решава дали да подаденият стринг е съществуващ клас и дали е имплементирал интерфейса Animal. Ако всичко е наред се създавa инстанция и метода move се изпълнява.
Въпреки, че има видима структура, НЕ е задължително да се използва унаследяване. Ти виждаш последователна структура с клас майка, докато някой друг може да види нуждата единствено от наличието на даден метод с определени параметри. Ти имаш нуждата наследника да изпълнява метод move дали на предшественика, дали негова интерпретация, решението ще е на база логика на приложението ти, докато на друг човек му е нужно този клас да има задължително собствен метод move без да има предшественик. Въпрос на гледна точка, дори различна, тя не е грешна, защото няма стандарт кога кое да се използва, има само препоръки. Всичко зависи от блок схемата на приложението и първоначално създадената структура.
Относно празните интерфейси те са безполезни, също като празните класове майки, които се наследяват. Хората си оставят възможността да задължат имплементиращите класове да имат определен метод използван някъде в приложението, докато добавянето на метод в празен клас майка, пък добавя логиката му, като опция за ползване при всички деца. В структурата с наследяване имаш опцията да използваш логиката на дефаутовият метод или да го презапишеш, докато с интерфейсите ти задължаваш класът просто да има такъв метод, без да даваш на наследниците опцията за дефаутова логика или да те интересува каква логика се съдържа в него.
Мой ред е да задам въпрос.
Ако метода move трябва да приема два параметъра, как ще задължиш наследниците при extend да използват тези два подадени параметъра? Те откъде ще знаят колко параметъра при презаписване на метода са нужни да приемат или дали да са public, protected и private?
PHP:
<?php
class A
{
public function move($empty,$string)
{
if (isset($empty) and isset($string)) {
print "<br>A ".$empty." ".$string;
}
}
}
class B extends A
{
public function move()
{
print "<br>B";
}
}
class C extends A
{
}
(new B)->move("параметър 1","параметър 2");
(new C)->move("параметър 1","параметър 2");
Ето така:
PHP:
<?php
interface I
{
public function move($empty,$string);
}
class A implements I
{
public function move($empty,$string)
{
if (isset($empty) and isset($string)) {
print "<br>A ".$empty." ".$string;
}
}
}
class B implements I
{
public function move()
{
print "<br>B";
}
}
class C implements I
{
}
(new A)->move("параметър 1","параметър 2");
(new B)->move("параметър 1","параметър 2");
(new C)->move("параметър 1","параметър 2");
или така
PHP:
interface I
{
public function move($empty,$string);
}
class A implements I
{
public function move($empty,$string)
{
if (isset($empty) and isset($string)) {
print "<br>A ".$empty." ".$string;
}
}
}
class B extends A
{
public function move()
{
print "<br>B";
}
}
class C extends A
{
}
(new B)->move("параметър 1","параметър 2");
(new C)->move("параметър 1","параметър 2");
Естествено съм сложил примери и методите им,може да се добавят или премахват или каквото Ви дойде на акъл за теста.