Interface Abstract Class

  • Автор темы Автор темы BeGe
  • Дата начала Дата начала

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.
Когда писал код понял где ошибка. Пусть кто-то научится на моих ошибках. Мне уже объяснения не требуются.
 
это что-то типа домашнего задания по теории программирования?
 
Отвечатет Александр Друзь: вопрос был в том что на такое объявление компилятор выдает Fatal error, нужно было лишь перевести его со словарем и чуть подправить код.
 
странная, кстати, ошибка.
почему функция должна быть public в B, какие проблемы если она protected?
зато если кто-то использует именно B как интерфейс, он не сможет позвать ее, вдруг это то что и хотелось автору.
 
denver
гхм, наверное я плохо донес смысл вопроса или вы просто хотели что-нибудь ляпнуть, но я спрашивал _почему_, по этой ссылке ничего об этом нет.
 
AnToXa

All methods declared in an interface must be public, this is the nature of an interface
 
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
 
AnToXa
Всё верно... Интерфейсы для этого и нужны, определять только public методы, protected и privated относятся к реализации самого класса, тем кто пользуется интерфейсом не надо знать об этих методах, всеравно воспользоваться (вызвать) ими не смогут.

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

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