Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Уточнения: про this и отличия protected, private (http://www.flasher.ru/forum/showthread.php?t=130280)

TommyLee 22.09.2009 16:30

Уточнения: про this и отличия protected, private
 
1. this. используется только для членов классов: переменных и ссылок на объект? Я так понял, что переменная не может быть "сама по себе", даже если она используется в методе того класса, в котором объявлена. в отличие от с++.

2.
Перевод Мука:
"Метод экземпляра, объявленный с использованием модификатора protected ... доступен только для кода класса, содержащего описание этого метода, или для кода потомков этого класса..."
и
"Метод экземпляра, объявленный с использованием модификатора private ... доступен только для кода класса, содержащего описание этого метода."
Разница только в том, что private нельзя вызвать из потомков? Не считая запрет доступа из того же самого или других пакетов.

alexcon314 22.09.2009 16:59

1."Сама по себе":
trace(this);
var a = this;
MyFunction(this);
Вы это имели в виду?
2. AS3 хэлп:
Цитата:

Идентификаторы управления доступом и наследование
Если свойство объявлено с использованием ключевого слова public, оно будет доступно для всего кода. Это означает, что ключевое слово public, в отличие от слов private, protected и internal, не накладывает ограничений на наследование свойств.

Если свойство объявлено с использованием ключевого слова private, оно доступно только в определяющем его классе, то есть не наследуется никакими подклассами. Такое поведение отличается от предыдущих версий ActionScript, где поведение ключевого слова private больше напоминало поведение protected в ActionScript 3.0.

Ключевое слово protected указывает, что свойство доступно не только для определяющего его класса, но и для всех подклассов. В отличие от ключевого слова protected в языке программирования Java, в ActionScript 3.0 protected не делает свойство доступным для всех других классов в одном пакете. В ActionScript 3.0 свойство, объявленное с использованием ключевого слова protected доступно только для подклассов. Более того, защищенное свойство доступно для подкласса независимо от того, находится он в том же пакете, что и базовый класс, или в другом.

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

TommyLee 22.09.2009 17:13

по 1.
Код AS3:

class VirtualPet{
              var petName;
              var curr=1000;
              var human;
              public function VirtualPet(name,curr_plus){
                  this.petName=name;
                  this.curr+=curr_plus;
                  this.human=new Human();
              }
}
}

об этом. что члены класса нельзя использовать "сами по себе", только через this. В с++ можно без this - просто взять и написать.

по 2. спасибо.

alexcon314 22.09.2009 17:22

Аа.. почему же только через this? Можно и с this и без него.
Код AS3:

class VirtualPet{
              var petName;
              var curr=1000;
              var human;
              public function VirtualPet(name,curr_plus){
                  petName=name;
                  this.curr+=curr_plus;
                  human=new Human();
              }
}


etc 22.09.2009 17:34

Лучше с ним)

ToRR 22.09.2009 17:36

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

TommyLee 22.09.2009 17:47

Цитата:

Сообщение от ToRR (Сообщение 852667)
this - указатель на объект, в контексте которого сейчас выполняется код.
он может быть и "сам по себе" - this можно передать как аргумент при вызове функции и тд и тп.

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

random13 22.09.2009 18:20

функция внутри метода, внутри нее this будет указывать на метод, если не ошибаюсь

Psycho Tiger 22.09.2009 18:28

Цитата:

Сообщение от etc (Сообщение 852665)
Лучше с ним)

Не хочу разводить холивар, но почему все таки лучше с ним?
Разницу вижу только в
Код AS3:

var arg1:*,arg2:*;
function func(arg1:*, arg2:*):void{
this.arg1=arg1;
this.arg2=arg2;
}

Для меня код с this читается как то сложнее, да и писать его постоянно не очень хочется. Хотя, может это лишь дело привычки.

random13 22.09.2009 18:35

Цитата:

Сообщение от Psycho Tiger (Сообщение 852680)
Не хочу разводить холивар, но почему все таки лучше с ним?
Разницу вижу только в
Код AS3:

var arg1:*,arg2:*;
function func(arg1:*, arg2:*):void{
this.arg1=arg1;
this.arg2=arg2;
}

Для меня код с this читается как то сложнее, да и писать его постоянно не очень хочется. Хотя, может это лишь дело привычки.

дело привычки, я тоже раньше не понимал, а теперь читается действительно лучше, а холивар уже был, в другой теме, пару месяцев назад

progman 22.09.2009 18:52

Цитата:

Сообщение от Psycho Tiger (Сообщение 852680)
Код AS3:

var arg1:*,arg2:*;
function func(arg1:*, arg2:*):void{
this.arg1=arg1;
this.arg2=arg2;
}


начнем с того что в приличном обществе за такой код долго бьют двухтомником Страуструпа по рукам. До образования гематомных пятен на последних.

что по мне так this перед переменной это дикость. оправданное приминение только как для передачи параметра - указатель на себя любимого.

iNils 22.09.2009 18:54

Цитата:

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

Добавлено через 1 минуту
Цитата:

начнем с того что в приличном обществе за такой код долго бьют двухтомником Страуструпа по рукам. До образования гематомных пятен на последних.
Умничать не надо? Это был абстрактный пример.

TommyLee 22.09.2009 19:53

Не знал, что это холивар. Я так понял, что это холивар как раз из-за того, что никто не в курсе, важен ли this для работы виртуальной машины?

iNils 22.09.2009 20:13

Почистил тему от словесного недержания. Писать о своем предпочтении использования this не надо, тема не об этом.
Цитата:

Я так понял, что это холивар как раз из-за того, что никто не в курсе, важен ли this для работы виртуальной машины?
Не важен. Холивар из-за оформления кода.

kup 22.09.2009 20:30

когда небыло ООП и классов, программировали так:

Код AS3:

struct Pos
{
        var x:int;
        var y:int;
}
 
function setPoistion(this:Pos, a:int, b:int)
{
        this.x = a;
        this.y = b;
}

оттуда и пошло, потом this стал ключевым словом, и передаваться в функции неявно, в основном используясь только когда нужно получить адрес структуры или разрулить неоднозначность с одинаковым именованием переменных. И указывать его всегда вобщем то ненужное заграмождение кода.

Но, если есть сомнения в квалификации коллег или вы пишите на PHP ставьте this в обязательном порядке. :)

TommyLee 22.09.2009 21:24

Цитата:

Сообщение от kup (Сообщение 852709)
когда небыло ООП и классов, программировали так:
....

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

SamFR 23.09.2009 04:22

Использовать this или нет – дело вкуса. Однако есть моменты, когда оно очень помогает. Один из них – разрешение области видимости. Взглянем, например, на следующий класс:

Код AS3:

public class Example{
 
    protected var mesage:String;
 
    public function Example(message:String){
        this.message = message;
    }
 
}

В данном случае область видимости параметра message перекрывает область видимости поля message. Для того, чтобы не извращаться и не называть параметр, например, messageParam, используем this для явного обращения к полю.

Также this используется для передачи ссылки на себя (например, parent.removeChild(this)). Без this этого не сделать никак. Однако следует учитывать, что в случае вызова функции с помощью call или apply this внутри неё может ссылаться, вообще говоря, куда угодно.

Так что, никакой это не анахронизм, а важный элемент языка.

ToRR 23.09.2009 09:36

Цитата:

меня интересуют причины введения в язык this, чтобы знать, какие грабли могут ждать. есть, конечно, подозрение, что это не технический нюанс, а логический - чтобы программисту легче было ориентироваться в коде, но не уверен..
причина - необходимость иметь ссылку на объект, в контексте которого сейчас выполняется код. простейший пример:
Код AS3:

class Foo
{
  private var foo:String;
 
  public function Foo(foo:String)
  {
      //упс. ну и как нам здесь разобраться, какая именно foo нам нужна? а вот так:
      this.foo = "sdfsdf"; // переменной объекта класса Foo присвоили значение. т.е. той переменной которая у нас вот так записана -  private var foo:String;
      foo = "never do this"; //аргументу конструктора присвоили значение.
      //зачем так запутано? вот зачем:
      this.foo = foo;
  }
}

почитайте про контекст (объект, в котором сейчас выполняется код). например здесь - http://javascript.ru/tutorial/object/thiskeyword.
ой. писАл ответ с 1ой страницы, не заметил, что есть 2ая, на которой все это уже объяснили...

divinus 23.09.2009 09:55

"когда небыло ООП и классов"
а когда-то и палками-копалками землю возделывали, и наверно было много противников "революции", когда какой-то мудак приделал к палке камень...
но смею напомнить, в связи с тем, что палка копалка была менее удобна она вымерла со временем ;)

TommyLee 23.09.2009 12:06

Цитата:

Сообщение от SamFR (Сообщение 852760)
Код AS3:

public class Example{
 
    protected var mesage:String;
 
    public function Example(message:String){
        this.message = message;
    }
 
}


такой вариант понятен.
Цитата:

Сообщение от SamFR (Сообщение 852760)
Также this используется для передачи ссылки на себя (например, parent.removeChild(this)).

и
Цитата:

Сообщение от ToRR (Сообщение 852793)
почитайте про контекст (объект, в котором сейчас выполняется код). например здесь - http://javascript.ru/tutorial/object/thiskeyword.

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

dimarik 23.09.2009 12:15

this соотносится только с экземплярами, никак не с классами. this указывает на текущий экземпляр, в котором был упомянут.

Psycho Tiger 23.09.2009 12:23

Цитата:

Как будто this - это указатель, который принимает адрес заранее неизвестного класса
this - ссылка на себя, то есть на свой экземпляр. В статичных методах нельзя использовать this, т.к. нет никаких экземпляров.
Код AS3:

var c:SomeClass=new SomeClass();
var a:SomeClass=c.returnMe();
 
class SomeClass{
...
function returnMe():SomeClass{
return this;
}
...
}

a и c теперь указывают на один объект.

TommyLee 23.09.2009 12:56

Цитата:

Сообщение от dimarik (Сообщение 852836)
this соотносится только с экземплярами, никак не с классами. this указывает на текущий экземпляр, в котором был упомянут.

да, некорректно написал.

Цитата:

Сообщение от Psycho Tiger (Сообщение 852838)
Код AS3:

...
function returnMe():SomeClass{
 return this;
}


с таким синтаксисом еще не знаком, поэтому только такая мысль: метод с помощью this возвращает всю структуру своего экземпляра. Верно?

dimarik 23.09.2009 12:58

Возвращает ссылку на этот экземпляр. Упоминание структуры объекта в данном контексте лишено смысла.

TommyLee 23.09.2009 13:15

Цитата:

Сообщение от dimarik (Сообщение 852845)
Возвращает ссылку на этот экземпляр. Упоминание структуры объекта в данном контексте лишено смысла.

Имел ввиду копирование значений своих внутренних переменных во внутренние переменные того экземпляра, который вызовет этот метод. Привычка из с++. Получается, данные не копируются?

Psycho Tiger 23.09.2009 13:20

Нене, копия не создается. Создается только ещё одна ссылка на экземпляр.
То есть в моём примере
Код AS3:

var c:SomeClass=new SomeClass();
var a:SomeClass=c.returnMe();
 
class SomeClass{
...
public var myValue:int=0;
//это просто метод, возвращающий this, а так как this - ссылка на себя, то и тип будет типом этого класса - т.е. SomeClass
public function returnMe():SomeClass{
return this;
}
...
}
...
trace(c.myValue); //0
trace(a.myValue); //0
c.myValue=5;
trace(c.myValue); //5
trace(a.myValue); //5


iNils 23.09.2009 13:31

Короче, this это Я.

TommyLee 23.09.2009 13:38

Так. У нас есть экземпляры одного класса: а, с.
Код AS3:

var c:SomeClass=new SomeClass();
var a:SomeClass=c.returnMe();

после этого что произошло? а стал "псевдонимом" с - как, например, указатель на объект в с++, 2 имени одного и того же?

ToRR 23.09.2009 14:11

a и c после этого указывают на 1 и тот же объект

BlooDHounD 23.09.2009 14:37

TommyLee, у Вас в c++ не было ссылок? или они имели особое значение для Вас?
Цитата:

Сообщение от Psycho Tiger
В статичных методах нельзя использовать this, т.к. нет никаких экземпляров.

экземпляры есть. нельзя использовать, так как это синтаксический запрет.

Добавлено через 30 минут
так как меня обещали в очередной раз покарать модераторы, за неполноценность предоставленной информации, то вынужден расписать "корень зла" для народа.

в объектных языках, всё - это объекты. а объект - это всегда экземпляр класса. и, входя в рекурсию, класс - это объект ( так как он входит в множество "всё" ).

TommyLee 23.09.2009 15:49

читал о безопасности, что напрямую работа с памятью запрещена. получается в as3 this - безопасный аналог указателей и ссылок в языках типа с/с++.

BlooDHounD 23.09.2009 16:15

нет. просто все виртуальные машины в этом мире, владеющие GC, предоставляют работу только со ссылками, за редким исключением со стороны парочки языков. любой объект - это ссылка на него. за исключением, так называемых, примитивных типов, которые, наоборот, всегда копируются. к примитивным типа обычно относятся int, uint, Number, String, Boolean.

TommyLee 23.09.2009 16:37

Раз все ссылка, то как пишется прототип функции, у которого аргумент - экземпляр класса?
Код AS3:

function sbd(this);

или
Код AS3:

function sbd(my:SomeClass);

?

dimarik 23.09.2009 17:02

С прототипами поаккуратнее =) В as3 они тоже есть

Код AS3:

var f:Function = new Function();
trace( f.prototype )

А в Вашем понимании - второй указанный пункт.

BlooDHounD 23.09.2009 17:12

this - это существующая ссылка на объект. причём объект, который является контекстом вызова метода. требовать его в аргументах к методу, это верх маразма. он существует всегда. я вот не понимаю, что в вашем понимании ссылка. так c моими представлениями, оно явно расходятся. для меня, ссылка - это сущность, которая позволяет работать с экземпляром, какого либо объекта. а для Вас?

TommyLee 23.09.2009 17:26

Цитата:

Сообщение от dimarik (Сообщение 852922)
С прототипами поаккуратнее =) В as3 они тоже есть

понял, спасибо за предупреждение.

Цитата:

Сообщение от BlooDHounD (Сообщение 852929)
this - это существующая ссылка на объект. причём объект, который является контекстом вызова метода. требовать его в аргументах к методу, это верх маразма. он существует всегда. я вот не понимаю, что в вашем понимании ссылка. так c моими представлениями, оно явно расходятся. для меня, ссылка - это сущность, которая позволяет работать с экземпляром, какого либо объекта. а для Вас?

для меня - как в с++:
void DoSmth(MyClass& obj);
void main() {
//.......
MyClass my;
DoSmth(my);
//..........
};
Каков аналог в as3?

BlooDHounD 23.09.2009 17:28

тоже самое, только & не нужно. все передаётся как ссылка.

TommyLee 23.09.2009 17:33

Хм, тогда как понять пример SamFR, который он привел на второй странице:
Код AS3:

parent.removeChild(this)

?

dimarik 23.09.2009 17:42

Ну дык это параметр, передаваемый методу. А не имя аргумента в принимающем методе.

BlooDHounD 23.09.2009 17:42

а что тут не понятного? вызывается метод removeChild у объекта parent, в который передаётся ссылка this.


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

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