Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 21.08.2014, 18:33
shmaser вне форума Посмотреть профиль Отправить личное сообщение для shmaser Найти все сообщения от shmaser
  № 1  
Ответить с цитированием
shmaser
 
Аватар для shmaser

Регистрация: Aug 2010
Сообщений: 22
По умолчанию Обращение к private свойствам между объектами одного и того же класса

Сразу пример:
Код AS3:
public class Example {
	private var variable:int;
 
	public function Example(variableArg:int) {
		variable = variableArg;
	}
	public function traceVariables(exampleArg:Example):void {
		trace(this.variable, exampleArg.variable); //выводит 1 2
		exampleArg.variable++;
		trace(this.variable, exampleArg.variable); //выводит 1 3
	}
}
Юзаем так:
Код AS3:
public class Main extends Sprite {
 
	public function Main() {
		var exampleA:Example = new Example(1);
		var exampleB:Example = new Example(2);
		exampleA.traceVariables(exampleB);
	}
}
Объекты одного и того же класса имеют полный доступ к внутренностям друг друга. Лично я лишь недавно узнал об этой "фиче". Т.е. доступ к свойствам объектов проверяется исходя из их классов, а не самих объектов. Возникает несколько вопросов: является ли это нарушением инкапсуляции? Есть ли реальное применение такого подхода, или стОит его избегать? Если объекту нужно узнать некоторую информацию о состоянии другого объекта того же класса, следует обращаться через публичный интерфейс объектов или напрямую считывать нужные переменные?

P.S. Подобное также допустимо во всех мейнстримных языках

Старый 21.08.2014, 18:51
Gerbert вне форума Посмотреть профиль Найти все сообщения от Gerbert
  № 2  
Ответить с цитированием
Gerbert
Banned
[+1 06.12.14]
[+1 18.12.14]
[+1 30.12.14]

Регистрация: Aug 2014
Сообщений: 461
Код AS3:
var a:int = 1;
var b:int = 2;
trace(a, b); // 1, 2
b++;
trace(a, b); // 1, 3
Вот и весь заговор.

Добавлено через 2 минуты
Проверьте в самом инстенсе exampleB...

Старый 21.08.2014, 19:05
shmaser вне форума Посмотреть профиль Отправить личное сообщение для shmaser Найти все сообщения от shmaser
  № 3  
Ответить с цитированием
shmaser
 
Аватар для shmaser

Регистрация: Aug 2010
Сообщений: 22
Gerbert, т.е. ваш код AVM интерпретирует как эквивалентный моему?

Старый 21.08.2014, 19:33
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 4  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
А как на счет немножечко вот такого:

Делаем класс с приватным свойством _prop. Ну и учим его выводить приватное свойство другого экземпляра такого же класса
Код AS3:
package
{
    public class A
    {
        private var _prop:int = 0;
 
        public function A()
        {
            super();
        }
 
        public function logOtherA(a:A):void
        {
            trace(a._prop);
        }
    }
}
Теперь создадим класс-наследник, в котором тоже объявим приватное свойство _prop
Код AS3:
package
{
    public class B extends A
    {
        private var _prop:int = 1;
 
        public function B()
        {
            super();
        }
    }
}
А теперь самое интересное. Так как B наследуется от A, то каждый экземпляр B является одновременно еще и экземпляром A. Однако, в каждом из классов есть приватное свойство _prop. Внимание, вопрос: "Что должен выводить метод logOtherA для экземпляра B? Что для экземпляра A?"

Код AS3:
package
{
    import flash.display.Sprite;
 
    public class Main extends Sprite
    {
        public function Main()
        {
            super();
 
            var a:A = new A();
            var b:B = new B();
 
            a.logOtherA(a); // 0
            a.logOtherA(b); // 0
 
            b.logOtherA(b); // 0
            b.logOtherA(a); // 0
        }
    }
}
Ага. Везде "0". Это значит что класс А имеет доступ к приватным полям класса А, и никаким больше.

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


Последний раз редактировалось gloomyBrain; 21.08.2014 в 19:48.
Старый 21.08.2014, 20:30
Gerbert вне форума Посмотреть профиль Найти все сообщения от Gerbert
  № 5  
Ответить с цитированием
Gerbert
Banned
[+1 06.12.14]
[+1 18.12.14]
[+1 30.12.14]

Регистрация: Aug 2014
Сообщений: 461
Цитата:
Gerbert, т.е. ваш код AVM интерпретирует как эквивалентный моему?
Могу и ошибаться! Первое что пришло в голову, что это одно и тоже, но сейчас уже не уверен.
У меня нет возможности проверить, но если Вам не сложно, то -

Код AS3:
public class Example {
	private var variable:int;
 
	public function Example(variableArg:int) {
		variable = variableArg;
	}
	public function traceVariables(exampleArg:Example):void {
		trace(this.variable, exampleArg.variable); //выводит 1 2
		exampleArg.variable++;
		trace(this.variable, exampleArg.variable); //выводит 1 3
	}
 
	public function report():int
	{
		return this.variable;
	}
}
Код AS3:
public class Main extends Sprite {
 
	public function Main() {
		var exampleA:Example = new Example(1);
		var exampleB:Example = new Example(2);
		exampleA.traceVariables(exampleB);
		trace(exampleA.report());
		trace(exampleB.report());
	}
}
Что показывает?

Старый 21.08.2014, 20:47
shmaser вне форума Посмотреть профиль Отправить личное сообщение для shmaser Найти все сообщения от shmaser
  № 6  
Ответить с цитированием
shmaser
 
Аватар для shmaser

Регистрация: Aug 2010
Сообщений: 22
gloomyBrain, спасибо за хороший пример, годится для лучшего понимания. Я почему-то всегда ассоциировал private как разрешенный только для данного конкретного инстанса, не знаю с чего это я взял. С точки зрения принципов ООП все же считаю, что private в рамках класса все же хуже чем в рамках инстансов, т.к. должны быть внутренние переменные, предназначенные только для внутреннего пользования. private в рамках класса позволяет объектам нарушить внутренне состояние других объектов, пусть даже одного и того же класса. С другой стороны, тот кто разрабатывает класс и добавляет в него обращение к приватам объектов того же класса сам же допускает подобное нарушение целостности для объектов своего же класса. Т.е. приватная переменная и код обращающийся к ней посредством другого однотипного объекта находятся в одном и том же классе и им ограничены, исходя из этого можно предположить, что такие обращения не будут нарушением инкапсуляции. Ну это мысли в слух, наверное я слишком загоняюсь

Gerbert,
Код AS3:
1 2
1 3
1
3

Старый 21.08.2014, 21:03
Gerbert вне форума Посмотреть профиль Найти все сообщения от Gerbert
  № 7  
Ответить с цитированием
Gerbert
Banned
[+1 06.12.14]
[+1 18.12.14]
[+1 30.12.14]

Регистрация: Aug 2014
Сообщений: 461
Фигня какая-то... Ведь так не должно быть, у экземпляра по ссылке exampleArg нет свойства variable...
Как вот такая exampleArg.variable++; запись может пройти?)

Старый 21.08.2014, 21:21
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 8  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Всегда считал, что приватность реализована на уровне экземпляра, а не на уровне класса. Но когда я узнал, что это не так, я, скорее, обрадовался — мне нужно было умножать текущую матрицу на другую матрицу. Вот уж где можно было без пабликов или геттеров/сеттеров лазить по приватным полям матрицы-аргумента!
__________________
Поймай яблоко 2!

Старый 21.08.2014, 22:36
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 9  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Мне тоже нужно лазить в матрицах!!! Как ты лазил? ))

Добавлено через 5 минут
Цитата:
Сообщение от Zebestov Посмотреть сообщение
Всегда считал, что приватность реализована на уровне экземпляра, а не на уровне класса.
В детстве, изучая чей-то код, я встретил метод clone(), в котором без всяких зазрений совести и наплевав на инкапсуляцию объект писал в приваты другому объекту. Для меня это выглядело очень интимно xD.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 21.08.2014, 22:44
nubideus вне форума Посмотреть профиль Отправить личное сообщение для nubideus Найти все сообщения от nubideus
  № 10  
Ответить с цитированием
nubideus

Регистрация: Jan 2013
Сообщений: 322
dimarik, так свои матрицу написал и лазал в ней

Создать новую тему Ответ Часовой пояс GMT +4, время: 21:17.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 21:17.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.