Интерфейс и абстрактный класс

malina95

Дракула кода:)
Привет, я пишу чтобы вы мне объяснили, почему если я делаю абстрактный класс с интерфейсом типа:
PHP:
<?php
abstract class Controller extends Core implements Interfaces\ControllerInterface {
public function index(){}
}
вот сам интерфейс:
PHP:
<?php
interface ControllerInterface {
public function index();
}
?>
и если я наследую абстрактный класс с ним, то в классы которые наследуют абстрактный, структура интерфейса не передаётся, почему?
 
Мне просто интересено, объясните дятлу... мне просто не хочется использовать абстрактные методы, мне с интерфейсами работать удобнее))) возможно я не прав, но всё таки.
 
ты в абстрактном классе объявил реализацию метода интерфейса, конечто наследник не обязан его реализовывать.
объявляй абстрактным методом тогда или не объявляй метод вообще.
 
мне говорили, что абстрактный метод работает только на одного наследника, а интерфейс работает с каждым классом который наследуется, это не правда чтоли?
 
как я понимаю, даже не читав статьи по хорошие статьи по ним, интерфейс составлфет набор методов который должен реализовать класс который его наследует, а абстрактный класс может передавать методы и свойства классу наследнику...
 
malina95
Класс может реализовывать множество интерфейсов, а наследоваться только от одного абстрактного класса
 
мне говорили, что абстрактный метод работает только на одного наследника, а интерфейс работает с каждым классом который наследуется, это не правда чтоли?
читайте книги. без основ далеко не уедешь.
 
Что это значит?

Опишите лучше, что вам нужно, чего вы ожидаете.

Я думал что интерфейс будет работать и в последующих классах, например:

interface -> abstract class -> class extends -> class extends .......

И что в каждом классе будут нужны обязательные методы из интерфейса, я не правильно понимаю да?
 
Правильно
только в вашем примере вы в абстрактном классе уже реализовали интерфейс
PHP:
public function index(){}

PHP:
<?php
abstract class Controller extends Core implements Interfaces\ControllerInterface {}

PHP:
class IndexController extends Controller {
   public function index(){}
}
 
Да, но ведь он работает только в нём, в наследников он не передаётся.
 
Да, но ведь он работает только в нём, в наследников он не передаётся.

Вы оперируете понятиями как далекий от программирования человек, поэтому сложно понять, что вам непонятно.

Что значит, не передается в наследников? Все наследники абстрактного класса будут иметь этот метод, реализованный вами в абстрактном классе. Если вы не хотите его там реализовывать, вам нужно объявить его абстрактным или, скорее всего, вообще этот абстрактный класс не должен реализовывать этот интерфейс, пусть его реализуют какие-то наследники, в которых реально нужна реализация.

Интерфейс не обязывает каждый класс в цепочке наследования объявлять свою собственную реализацию. Он обязывает только тот класс, который непосредственно его реализует.

Вообще странное желание, хотеть, чтобы все классы в цепочке наследования обязательно объявляли свою реализацию какого-то метода. Пахнет извращением.
 
правильно не заставлять имплементировать, а подразумевать что обьекты которые принимает тот или иной метод его имплементировали!
PHP:
interface A{ public function b(); }

PHP:
...
// только обьекты типа A
public function c( A $d ){
    // тк. подразумеваю метод b
    $d->b();
}
...
 
правильно не заставлять имплементировать, а подразумевать что обьекты которые принимает тот или иной метод его имплементировали!
PHP:
interface A{ public function b(); }

PHP:
...
// только обьекты типа A
public function c( A $d ){
    // тк. подразумеваю метод b
    $d->b();
}
...

Во, ты мой герой:D Я как раз и не понимаю этой фишки, объясни пожалуйста поподробнее... Что будет если в методе например написать public function method (\MyInt $ddd) а в интерфейсе это interface MyInt{ public function method(); } ???
 
Во, ты мой герой:D Я как раз и не понимаю этой фишки, объясни пожалуйста поподробнее... Что будет если в методе например написать public function methodA (\MyInt $ddd) а в интерфейсе это interface MyInt{ public function methodB(); } ???

это значит что в methodA можно передать только обьекты типа MyIn, а это значит, что у этого обьекта есть methodB

никто не воспользуется твоим methodA не передав ему обьект MyIn
можешь на это полагаться, интерпретер не пропустит!. пиши свой methodA дальше зная это!

http://ru.wikipedia.org/wiki/Наблюдатель_(шаблон_проектирования)
Observable принимает только Observer обьекты и может с ними работать на уровне открытого интерфейса (handleEvent). а
Observer.png


сразу скажу что все примеры википедии страдают либо некрасивой реализацией либо неполным UML

не плохая реализация observer http://perevodik.net/ru/posts/16/ (неправильно то что ErrorLogger и DatabaseWriter знают что-то о EmailValidator хотя-бы даже EmailValidator::EVENT_EMAIL_INVALID)
 
Сверху