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

malina95

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

malina95

Дракула кода:)
Мне просто интересено, объясните дятлу... мне просто не хочется использовать абстрактные методы, мне с интерфейсами работать удобнее))) возможно я не прав, но всё таки.
 

Gas

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

malina95

Дракула кода:)
мне говорили, что абстрактный метод работает только на одного наследника, а интерфейс работает с каждым классом который наследуется, это не правда чтоли?
 

malina95

Дракула кода:)
как я понимаю, даже не читав статьи по хорошие статьи по ним, интерфейс составлфет набор методов который должен реализовать класс который его наследует, а абстрактный класс может передавать методы и свойства классу наследнику...
 

zuzmic

Новичок
malina95
Класс может реализовывать множество интерфейсов, а наследоваться только от одного абстрактного класса
 

AmdY

Пью пиво
Команда форума
мне говорили, что абстрактный метод работает только на одного наследника, а интерфейс работает с каждым классом который наследуется, это не правда чтоли?
читайте книги. без основ далеко не уедешь.
 

malina95

Дракула кода:)
Что это значит?

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

interface -> abstract class -> class extends -> class extends .......
И что в каждом классе будут нужны обязательные методы из интерфейса, я не правильно понимаю да?
 

zuzmic

Новичок
Правильно
только в вашем примере вы в абстрактном классе уже реализовали интерфейс
PHP:
public function index(){}
PHP:
<?php
abstract class Controller extends Core implements Interfaces\ControllerInterface {}
PHP:
class IndexController extends Controller {
   public function index(){}
}
 

malina95

Дракула кода:)
Да, но ведь он работает только в нём, в наследников он не передаётся.
 

radioheaded

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

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

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

Вообще странное желание, хотеть, чтобы все классы в цепочке наследования обязательно объявляли свою реализацию какого-то метода. Пахнет извращением.
 

WMix

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

malina95

Дракула кода:)
правильно не заставлять имплементировать, а подразумевать что обьекты которые принимает тот или иной метод его имплементировали!
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(); } ???
 

WMix

герр M:)ller
Партнер клуба
Во, ты мой герой: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). а


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

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