Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript (http://www.flasher.ru/forum/forumdisplay.php?f=5)
-   -   Вопрос по Робину Дебройлу (ООП) (http://www.flasher.ru/forum/showthread.php?t=51735)

Nox Noctis 20.11.2003 20:09

2Sergey"iLoveYou"
сергей, с примером уже разобрались давно :)
вопрос только зачем он такой странный :)

2dm_nev
аа... ну вот. я тебе это и сказал только не так подробно...

но, имхо, этот пример все только запутывает...
я думаю надо было показать наследование отдельно а вписывание методов отдельно...
(хотя кто я такой чтобы ему советовать :)) )

Whatsername 20.11.2003 20:15

Цитата:

все объясняет и раскладывает по полочкам.
Sergey"iLoveYou", если бы у меня все полочки лежали на своих полочках, то я бы ни спрашивал ни про какие ООПолочкины структуры ;)

Я что-то совсем запутался... :eek: Скажите просто что делает строчка
Код:

this.$_base = Pet;
Может кофе выпить?

Whatsername 20.11.2003 20:24

2 Nox Noctis, уже разобрались?
Цитата:

потому что в классе Dog НЕТУ такого метода - Pet...
Разве this в классе Дог указывает не на экземпляр (rover), разве этот экземпляр не может вызвать метод Pet?

Nox Noctis, я понимаю, что у тебя чувство, будто ты седьмой раз мне одно и тоже повторяешь, но я ей-ей не понимаю.

Whatsername 20.11.2003 21:16

спасибо
 
Ребята, тут все это знают, но я скажу еще раз:
Код:

this.$_base = Pet;
$_base получает метод Pet, иначе этот метод не вызвать.
Все верно?
Спасибо большое :D

Nox Noctis 20.11.2003 22:20

хмм... ну все же написано уже :)
а у дебройля вообще длинно и подробно разжевано...

смотри:
Код:

Pet = function (name) {
        trace("test : "+this+" : "+this.test);
};
Dog = function (name) {
        trace("is Pet function here ? "+(Pet ? "yes" : "no"));
        Pet();
        trace("is this.Pet function here ? "+(this.Pet ? "yes" : "no"));
        this.Pet();
};
Dog.prototype.test = "this is a Dog class member";
rover = new Dog("Rover");

убрали все лишнее..

в конструкторе Дог смотрим видна ли функция (ЭТО НЕ МЕТОД) Pet в данной области видимости имен. потом проверяем то же самое для this.Pet...

this.Pet естесственно не видна. если бы мы сделали так:
Код:

Pet = function (name) {
        trace("test : "+this+" : "+this.test);
};
Dog = function (name) {
        trace("is Pet function here ? "+(Pet ? "yes" : "no"));
        Pet();
        trace("is this.Pet function here ? "+(this.Pet ? "yes" : "no"));
        this.Pet();
};
Dog.prototype.test = "this is a Dog class member";
Dog.prototype.Pet = Pet
rover = new Dog("Rover");

то все бы заработало. потому что мы добавили к классу Дог МЕТОД Pet.

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

iLoveYou 20.11.2003 22:43

Nox, понятно :)
меня пример смутил наличием Dog.prototype.__proto__ = Pet.prototype;
вопрос, оказывается, в другом был. :)

Whatsername 21.11.2003 11:25

Спасибо большое, Nox Noctis ты мне очень помог. Я наконец-то понял как это работает. Метод - просто свойство, принадлежащее классу, иначе он (метод) работать не будет.
Хотя я встречал исходники, где определяется функция (метод), а потом к ней (к нему) обращаются все кто захочет - любые переменные.
Например в первом кадре определяется метод formatbytes (bytes); для форматирования bytes в дружественный размер (57 Kb, 1.3 Mb), а во втором кадре левая переменная, содержащая getBytesLoaded (); обращается к formatbytes (bytes); и все работает! Это не против правил ООП? Ведь переменная, содержащая getBytesLoaded (); не имеет метода formatbytes (); в своем свойстве.
Если я что-то напутал, то я уверен, что все равно соображу - рано или поздно. А вот если ты уже засыпаешь читая мои вопросы - забудь. Спасибо большое. :)

Nox Noctis 21.11.2003 11:40

Цитата:

Оригинал написал(а) dm_nev
Метод - просто свойство
Цитата:

Оригинал написал(а) dm_nev
обращаются - любые переменные
что-что, простите ? http://demonscity.combats.ru/i/smile/rotate.gif
ладно фиг с ними с формулировками, главное чтобы ты сам понимал что сказал :))

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

но функция может и не быть привязана к объекту. можно вызывать функцию саму по себе.
например проверь:
Код:

test = function () {
        trace(this);
};
id = setInterval(test, 500);

в аутпуте будет undefined. потому что функция вызвана НЕ как метод.

если ты определяешь функцию без указания объекта в котором ее прописываешь, то она автоматически становится МЕТОДОМ того мувиклипа в котором находится код.
например, если напишем в руте:
function test () {
// ...
}
то тест станет методом рута. и this внутри нее будет указывать на _левел0

Whatsername 24.11.2003 19:00

Dear Nox Noctis, я решил больше ничего не писать в этом топике пока не стану супер ООПером (ужас), чтобы не нервировать тебя и людей, незаслуживающих такого непонимания с моей стороны...
Спасибо большое тебе (и не только тебе)... ребята, наверное мне нужно больше почитать книг "мы купили комьютер" или "видоус для чайников", так как я пребываю в полной уверенности, что this в методе DOG указывает на rover (будущий экземпляр DOG), и будучи полноценным экземпляром - может вызывать методы, в том числе PET.
Спасибо ребята, я все распечатал и обязательно осилю - ваша помощь не напрасна :)

Nox Noctis 24.11.2003 19:07

гррррр... :))

в этом примере
ПЕТ ЭТО НЕ МЕТОД КЛАССА ДОГ
понимаешь ? :)
в описании класса нету такого метода.

его ВРЕМЕННО делают методом объекта РОВЕР
(в результате чего, как ты и сказал, this внутри Pet'а указывает на ровера)

но если бы этого не сделали
(всей этой ботвы с переменной $_base)
то внутри Pet'а this указывал бы на _level0, где и прописан изначально...


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

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