dimagolov
Новичок
А зачем тогда понадобился уровень доступа private? С такой логикой и protected достаточно...Наследование - это взяли и скопировали один объект в другой. Какая тут инкапсуляция?
А зачем тогда понадобился уровень доступа private? С такой логикой и protected достаточно...Наследование - это взяли и скопировали один объект в другой. Какая тут инкапсуляция?
— «доступен для расширения»? В каком смысле?Автор оригинала: whirlwind
private нужен что бы обеспечить работу по принципу - закрыт от изменений, доступен для расширения
Собственно я об этом и "твердю":Автор оригинала: weregod
phpamid
private свойства имеют область видимости для методов именно того класса, в котором свойства описаны.
class Father
{
//private $my_private_member = 'Father private member';
public function show_private_member()
{
echo $this->my_private_member;
}
}
class Son extends Father {
private $my_private_member = 'Son private member';
}
$son_instance = new Son;
$son_instance->show_private_member();
class Father
{
private $my_private_member = 'Father private member';
public function show_private_member()
{
echo $this->my_private_member;
}
}
class Son extends Father {
private $my_private_member = 'Son private member';
}
class Baby extends Son {
private $my_private_member = 'Baby private member';
}
class BabySon extends Baby {
private $my_private_member = 'BabySon private member';
}
$babyson_instance = new BabySon;
$babyson_instance->show_private_member();
class Father
{
private String my_private_member = "Father private member";
public void show_private_member()
{
System.out.println(this.my_private_member);
}
}
class Son extends Father
{
private String my_private_member = "Son private member";
}
public class test {
/**
* @param args
*/
public static void main(String[] args){
// TODO Auto-generated method stub
Son son_instance = new Son();
son_instance.show_private_member();
}
}
ВЫ ожидали. А мы - нет. Еще раз - если следовать вашей логике, то любое наследование от родительского класса делает невозможным использование приватных свойств в принципе. Типа, работал класс работал - отнаследовали - все перестало работать. Это, по вашему, логично? Ну тогда странная логика у вас.Автор оригинала: phpamid
Как бы ожидали: "BabySon private member"
Получили: "Father private member"
1) Спасибо, что запостил результат кода ... )))Автор оригинала: Adelf
phpamid
Все-таки когда приводишь код - пости хотя его результат.
Fatal error: Cannot access private property Son::$my_private_member in T:\home\localhost\www\4.php on line 7
Это на твой первый кодВот это уже можно считать багом. Метод отца хочет получить доступ к свойству сына. Хотя... это же PHP. Статически-типизированный язык выдал бы ошибку компиляциию.. а PHP ничего другого не остается кроме как выкручиваться.
Java:
Вывод: Father private memberPHP:class Father { private String my_private_member = "Father private member"; public void show_private_member() { System.out.println(this.my_private_member); } } class Son extends Father { private String my_private_member = "Son private member"; } public class test { /** * @param args */ public static void main(String[] args){ // TODO Auto-generated method stub Son son_instance = new Son(); son_instance.show_private_member(); } }
Я то не сомневался...
-~{}~ 31.07.10 14:12:
phpamid
Я помоему уже все как мог обьяснил. Что именно тебе непонятно?
Внимательно перечитайте пост.Автор оригинала: MiksIr
ВЫ ожидали. А мы - нет. Еще раз - если следовать вашей логике, то любое наследование от родительского класса делает невозможным использование приватных свойств в принципе. Типа, работал класс работал - отнаследовали - все перестало работать. Это, по вашему, логично? Ну тогда странная логика у вас.
ок, пусть будет декоратор - как пример когда классу-потомку не надо иметь прямого доступа к какому-то свойству родительского класса
И в дочернем и в родительском поменял?Автор оригинала: A1x
НО когда меняю private на protected Java продолжает вести себя так-же (как ни странно), тогда как пхп ведет по-другому (как и ожидалось)
public class Father {
protected String hello = "Father says hello";
public void hello() {
System.out.println(this.hello);
}
}
public class Son extends Father {
protected String hello = "Son says hello";
}
Father f = new Father();
f.hello();
Son s = new Son();
s.hello();