Interface Abstract Class

BeGe

Вождь Апачей, блин (c)
Interface Abstract Class

Кто мне сможет объяснить почему :confused:
PHP:
<?
interface A {
    function test1();
    function test2();
}

abstract  class B implements A {
    
    protected function test1() {
        return true;
    }
    
    public function test2() {
        return true;
    }
    
    abstract function test3();
}

final class C extends B {
    function test3() {
        return true;
    }
}

$c = new C;
?>

P.S.
Когда писал код понял где ошибка. Пусть кто-то научится на моих ошибках. Мне уже объяснения не требуются.
 

Frol

Новичок
это что-то типа домашнего задания по теории программирования?
 

denver

?>Скриптер
Отвечатет Александр Друзь: вопрос был в том что на такое объявление компилятор выдает Fatal error, нужно было лишь перевести его со словарем и чуть подправить код.
 

AnToXa

prodigy-одаренный ребенок
странная, кстати, ошибка.
почему функция должна быть public в B, какие проблемы если она protected?
зато если кто-то использует именно B как интерфейс, он не сможет позвать ее, вдруг это то что и хотелось автору.
 

AnToXa

prodigy-одаренный ребенок
denver
гхм, наверное я плохо донес смысл вопроса или вы просто хотели что-нибудь ляпнуть, но я спрашивал _почему_, по этой ссылке ничего об этом нет.
 

HraKK

Мудак
Команда форума
AnToXa

All methods declared in an interface must be public, this is the nature of an interface
 

HraKK

Мудак
Команда форума
а...
посмотри как реализованр Interface в пхп
 

AnToXa

prodigy-одаренный ребенок
HraKK
ты имеешь в виду внутрях в движке?
но ведь это не отвечает на вопрос почему :)
по той ссылке я ессно читал, давно и еще раз перечитал сейчас, ну нету там ответа на мой вопрос.
я тут проверил, эта штука совершенно не специфична для интерфейсов, что неудивительно.
PHP:
<?php

	class Base {
		public function foo() { echo __METHOD__ , "\n"; }
	};

	class Derived extends Base {
		private function foo() { echo __METHOD__ , "\n"; }
	};

	$b = new Derived();
	$b->foo();
?>
точно также говорит:
antoxa@##:~/_Dev/_Exp> php5 -f ./1.php
PHP Fatal error: Access level to Derived::foo() must be public (as in class Base) in
 

itprog

Cruftsman
AnToXa
Всё верно... Интерфейсы для этого и нужны, определять только public методы, protected и privated относятся к реализации самого класса, тем кто пользуется интерфейсом не надо знать об этих методах, всеравно воспользоваться (вызвать) ими не смогут.

Со вторым примером тоже логично, в классе Derived ты переопределяешь foo(), в дальнейшем скорее всего хочешь подменить объект класса Base на объект Derived, что иначе приведет к ошибке доступа.
 

berkut

Новичок
то-же будет и с protected -> private
в наследнике, уровень доступа должен быть таким-же или более открытым, чем в родителе. В какой-то ооп книжке читал, что это одна из идиологий ооп
 

AnToXa

prodigy-одаренный ребенок
Автор оригинала: itprog
AnToXa
Всё верно... Интерфейсы для этого и нужны, определять только public методы, protected и privated относятся к реализации самого класса, тем кто пользуется интерфейсом не надо знать об этих методах, всеравно воспользоваться (вызвать) ими не смогут.

Со вторым примером тоже логично, в классе Derived ты переопределяешь foo(), в дальнейшем скорее всего хочешь подменить объект класса Base на объект Derived, что иначе приведет к ошибке доступа.
да, я подменю, но интерфейс-то у меня буддет Base, т.е. я и знать "не хочу и не буду" ни про какой Derived(ибо в этом весь поинт интерфейсов, не так ли) и вызывать я будду "функции из интерфейса", которые собсна public, а вот если я захочу вызвать напрямую Derived::foo() минуя Base, то я должен получить по рукам, в чем собсна и состоит поинт объявления функции как private.
 
Сверху