Форум 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=50595)

iLoveYou 27.10.2003 18:12

ООП: (зажмурившись) ммм.. ИнХерИтАнс..
 
всей душой и телом приветствую любителей глубокого флеш-программирования на этом скромном форуме. вашему вниманию предлагается небольшая задача. она совсем простая: нужно всего лишь ознакомиться со следующим кодом и не задумываясь ответить на пару пустячковых вопросов. итак, код в студию:
Код:

function SuperClass() {
        trace("SuperClass constructor called");
        this.__proto__.f1 = function() {
                trace("f1 called");
        };
        this.f2 = function() {
                trace("f2 called");
        };
}
function SubClass() {
        trace("SubClass constructor called");
}
SuperClass.prototype.__proto__.f3 = function() {
        trace("f3 called");
};
SubClass.prototype.__constructor__ = SuperClass;
obj = new SuperClass();
trace("---------------");
obj.f1();
obj.f2();
obj.f3();
trace("******************************");
obj2=new SubClass();
trace("---------------");
obj2.f1();
obj2.f2();
obj2.f3();

Ну а теперь вопросы:
1) какую строчку (всего одну) нужно добавить в этот незатейливый код, чтобы методы f1() и f2() могли быть вызваны и для объектов класса SubClass?
2) совсем просто: в чем различия реализации методов f1(), f2(), f3()?
3) черт, только сейчас заметил: если удалить
Код:

SubClass.prototype.__constructor__ = SuperClass;
метод f3() все равно вызывается; к чему бы это?
Первому ответившему на все вопросы верно будет присвоено звание глубокого флеш-программиста и памятный значок с дарственной надписью "Я люблю ПротивныеТипы".

ЗЫ пользователи ||||||||||, lexass, Baltika, DeliMiter, Nox Noctis к участию не допускаются.

ЗЗЫ просьба не воспринимать слишком серьезно -- все равно призов на всех не хватит.

2K WebStudio 27.10.2003 21:58

пункт 1:
ты хочешь, чтобы в outpute было вот это?
SuperClass constructor called
---------------
f1 called
f2 called
f3 called
******************************
SubClass constructor called
---------------
f1 called
f2 called
f3 called
Так?

iLoveYou 27.10.2003 22:16

ты б мысль не заканчивал на полуслове. и еще: раз уж взялся за задачку, то, пожалуйста, с объяснениями и поподробней, да.

sergwizard 27.10.2003 23:04

1. Я бы написал все это так:
Код:

function SuperClass() {
        trace("SuperClass constructor called");
        this.__proto__.f1 = function() {
                trace("f1 called");
        };
        this.f2 = function() {
                trace("f2 called");
        };
}
function SubClass() {
        trace("SubClass constructor called");
}
SubClass.prototype.__proto__.f3 = function() {
        trace("f3 called");
};
SubClass.prototype = new SuperClass();
obj = new SuperClass();
trace("---------------");
obj.f1();
obj.f2();
obj.f3();
trace("******************************");
obj2=new SubClass();
trace("---------------");
obj2.f1();
obj2.f2();
obj2.f3();

2. реализация методов f1(), f2(), f3() видна из записи.
3. Эта строчка нихрена не значит.

2K WebStudio 27.10.2003 23:13

Знаешь что чувак!
Такой попсы я давно не видел!!!
Вот те скрипт:
function SuperClass() {
trace("SuperClass constructor called");
}
SuperClass.prototype.__proto__.f1 = function() {
trace("f1 called");
};
SuperClass.prototype.f2 = function() {
trace("f2 called");
};
function SubClass() {
trace("SubClass constructor called");
}
SuperClass.prototype.f3 = function() {
trace("f3 called");
};
SubClass.prototype = SuperClass.prototype;
obj = new SuperClass();
trace("---------------");
obj.f1();
obj.f2();
obj.f3();
trace("******************************");
obj2 = new SubClass();
trace("---------------");
obj2.f1();
obj2.f2();
obj2.f3();

А вот те ссылка на самый простой справочник на эту тему!!!

iLoveYou 27.10.2003 23:17

Цитата:

SubClass.prototype = new SuperClass();
гы заменять строчки нельзя ;) нужно только добавить.
Цитата:

2. реализация методов f1(), f2(), f3() видна из записи.
ну да, видна, но тут нужны пояснения :)
Цитата:

3. Эта строчка нихрена не значит.
емкая, конечно, фраза. но ответа на поставленный вопрос она не дает.
и вообще, Визард, почему я тебя не включил в список досрочно дисквалифицированных?

2K WebStudio 27.10.2003 23:21

Теперь ответь мне!
Книжек надо больше читать!
Фигня какая-то, а не скрипт!
Посмотри на ссылке создание объектов!

iLoveYou 27.10.2003 23:50

2K WebStudio
ага, вот ты-то мне и нужен.
ты не ответил ни на один из поставленных вопросов и, более того, породил у меня новые.
1) какую смысловую нагрузку несет следующая запись:
SubClass.prototype = SuperClass.prototype;
2) почему ты определяешь методы так по-разному:
Цитата:

SuperClass.prototype.__proto__.f1 = function() {
trace("f1 called");
};
и
Цитата:

SuperClass.prototype.f2 = function() {
trace("f2 called");
};
ЗЫ книжками отмазываться не нУно.

2K WebStudio 27.10.2003 23:55

Делаю это отдельно т.к. так меньше оперативки жрёт!
Кажется, там это написано!!!
А без этой строки, естественно ничего не пашет!

iLoveYou 28.10.2003 00:05

вот я сейчас пытаюсь для себя решить: ты намеренно флудишь или действительно не понимаешь, вообще о чем идет речь.
либо внимательно прочти первое сообщение и попытайся ответить на поставленные вопросы, либо не засоряй эфир.
+ дополнительные вопросы повисли:
1) какую смысловую нагрузку несет следующая запись:
SubClass.prototype = SuperClass.prototype;
2) почему ты определяешь методы так по-разному:
--------------------------------------------------------------------------------
SuperClass.prototype.__proto__.f1 = function() {
trace("f1 called");
};
--------------------------------------------------------------------------------
и
--------------------------------------------------------------------------------
SuperClass.prototype.f2 = function() {
trace("f2 called");
};
--------------------------------------------------------------------------------

nuran 28.10.2003 09:02

посмотрим, подумаем. Я из клубы - дома сейчас модема нет. Скопирую подумаю. Сейчас...

Пушистик 28.10.2003 16:25

Sergey"iLoveYou", эт действительно трабла? ил ты решил попонтоватся и устроить экзамен тут всем по ООП?...
ЗЫ: оч.смешно со стороны...

iLoveYou 28.10.2003 18:01

Цитата:

Оригинал написал(а) Пушистик
Sergey"iLoveYou", эт действительно трабла? ил ты решил попонтоватся и устроить экзамен тут всем по ООП?...
ЗЫ: оч.смешно со стороны...

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

Пушистик 28.10.2003 18:49

Sergey"iLoveYou", у тебя Очень завышенная самооценка! ;) ты пытешься строить из себя некого "флэш-философа", думая что поразишь всех своими ответами, юзая при этом всякие клише...
думаешь что сможешь поставить всех на место и никто ничего не сможет тебе возразить...!
ЗЫ: Будешь говорить такие фразы целый год - можешь за умного сойти... ;)

iLoveYou 28.10.2003 19:14

Цитата:

Оригинал написал(а) Пушистик
Sergey"iLoveYou", у тебя Очень завышенная самооценка! ;) ты пытешься строить из себя некого "флэш-философа", думая что поразишь всех своими ответами, юзая при этом всякие клише...
думаешь что сможешь поставить всех на место и никто ничего не сможет тебе возразить...!
ЗЫ: Будешь говорить такие фразы целый год - можешь за умного сойти...

1) да, у меня гипертрофированная самооценка
2) да, я пытаюсь даже к флешу подойти отчасти по-философски
3) да, я пытаюсь поразить всех умными высказываниями
4) да, я юзаю клише
5) да, я ставлю ламерков, подобных тебе, на место, и они не могут ничего конструктивно возразить
6) если я целый год буду объяснять людям, что лучше высказываться по предложенной теме, а не обсуждать меня-любимого, то я скорее сойду с ума, чем буду казаться умным шибко
7) подобных высказываний я выслушал за жизнь очень много -- судьба такая.

Пушистик 28.10.2003 19:38

Sergey"iLoveYou", да ладно...не нервничай так чувак:)не обижайся, если чё... :)

iLoveYou 28.10.2003 19:45

все перетерли?
может, теперь, по теме чего-нибудь? а то медаль скоро гнить начнет ;)

Штрек 29.10.2003 07:04

SubClass.prototype= new SuperClass(); :D
Об чём Вы тут спорите?
Я спросил как то рабочий шрифт, так мне кроме Ариэля ничего больше не предложили. :D

nuran 29.10.2003 12:02

Лично я считаю что Sergey мало что понимает в глубоком flash программировании.

Пушистик 29.10.2003 14:14

Цитата:

Оригинал написал(а) nuran
Лично я считаю что Sergey мало что понимает в глубоком flash программировании.
nuran, как ты мог даже подумать такое ? :D :D :D :D

Пушистик 29.10.2003 14:19

Цитата:

Оригинал написал(а) Sergey"iLoveYou"
все перетерли?
может, теперь, по теме чего-нибудь? а то медаль скоро гнить начнет ;)

а ты её опусти в стакан с сахаром...!
пацаны, давайте!получите эту "медаль" и можете бегать по улице и кричать: "АААААААААааааааа.....мне сам Sergey"iLoveYou" медаль вручил!!!!аааааааааа....я терь самый крутой!!!!ааааааа....!!!" Макромедия как раз ищет такие работников... :D

nuran 29.10.2003 15:19

Цитата:

Оригинал написал(а) Пушистик


nuran, как ты мог даже подумать такое ? :D :D :D :D

А я вижу, как он комментирует мои посты, при чём постоянно, не понимая смысла и сложности исходников. Он постоянно ссылается на других, но при этом сам (по крайней мере я не видел) ничего средне-сложного не сделал. Он говорит, что текстурирование лёгкая вещь, хотя сам даже не знает, что это такое. Он хвастунишка - вот кто он. Товарищь Сергей.

iLoveYou 29.10.2003 15:41

Цитата:

SubClass.prototype= new SuperClass();
Штрек, в данном примере как раз показан некий отход от предложенного макромедией варианта осуществления наследования классов в 6-ке. Ты, наверное, заметил строчку
Код:

SubClass.prototype.__constructor__ = SuperClass;
вот в ней-то вся штука.
спасибо за то, что высказался по теме.

Techmaker 29.10.2003 18:16

Сразу говорю, я только что со школы, так что думать сильно не могу :)

1.
Код:

function SuperClass() {
        trace("SuperClass constructor called");
        this.__proto__.f1 = function() {
                trace("f1 called");
        };
        this.f2 = function() {
                trace("f2 called");
        };
}
function SubClass() {
        trace("SubClass constructor called");
}
SuperClass.prototype.__proto__.f3 = function() {
        trace("f3 called");
};
SubClass.prototype.__constructor__ = SuperClass;
SubClass=SuperClass;
obj = new SuperClass();
trace("---------------");
obj.f1();
obj.f2();
obj.f3();
trace("******************************");
obj2=new SubClass();
trace("---------------");
obj2.f1();
obj2.f2();
obj2.f3();

2.
f1 - метод способен добавлятся к другим классам таким образом: SubClass.prototype.__proto__=SuperClass.prototype
f2 - просто метод который спецефически принадлежит только этому "SuperClass'у" :) , не способен добавлятся к другим классам :)
f3 - метод добавляется, и может быть запущен, всеми созданными классами, всё обосновывается одним лишним "__proto__" ;)

3.
SubClass.prototype.__constructor__ = SuperClass;
к чему бы это? :rolleyes: хмм... :) наверное к тому что ты прицепил это __proto__
вот сюда:
Цитата:

Оригинал написал(а) Sergey"iLoveYou"
Код:

SuperClass.prototype.__proto__.f3 = function() {
        trace("f3 called");
};



iLoveYou 29.10.2003 18:47

Techmaker, ты сейчас очень поднялся в моих глазах, говорю без всякой иронии. :) хотя с заданием намудрил ;)
1. SubClass=SuperClass;
и где же тута инхеританс? смысл-то задания не в том, чтоб получить в аутпуте
Цитата:

f1 called
f2 called
f3 called
а разобраться в тонкостях механизма наследования :cool:
2. f1 - вот тут я тебя не совсем понял.
f2 - по сути близко, но формулировка немного.. того ;)
f3 - то же, что и с f2.
3. неа.

спасибо, Techmaker.

Techmaker 29.10.2003 19:12

интерестно почему же 3 не правильно... :rolleyes:

llllllllll 29.10.2003 19:25

_root.f3(); ;)

iLoveYou 29.10.2003 19:34

Цитата:

Оригинал написал(а) Techmaker
интерестно почему же 3 не правильно... :rolleyes:
бррр! по сути верно, но механизм объяснишь?
ладно, сам отвечу на третий вопрос.
Код:

ASSetPropFlags(SuperClass.prototype.__proto__, null, 0, 1);
for (i in SuperClass.prototype.__proto__) {
        trace(i);
}
trace(SuperClass.prototype.__proto__ == Object.prototype);

ЗЫ
2 llllllllll, игра со зрителями еще не началась ;)

Techmaker 29.10.2003 19:37

это что подсказка? :)

если да, то я имел ввиду, что если убрать вот это __proto__ вот здесь:

SuperClass.prototype.f3 = function() {
trace("f3 called");
};

то будет всё как надо :)

iLoveYou 29.10.2003 19:46

Цитата:

Оригинал написал(а) Techmaker
это что подсказка? :)

SuperClass.prototype.f3 = function() {
trace("f3 called");
};
то будет всё как надо :)

это понятно, но при существующем коде, т.е. с "потерявшейся" строчкой методы f1,f2,f3 не получится вызвать :)
f3 - изначально обманка, поскольку
trace(SuperClass.prototype.__proto__ == Object.prototype); даст true.

Techmaker 29.10.2003 20:03

я что-то непонямаю :)

а вообще по-моему вот самй лучший вариант :)
Код:

function SuperClass() {
        trace("SuperClass constructor called");
        this.__proto__.f1 = function() {
                trace("f1 called");
        };
        this.__proto__.f2 = function() {
                trace("f2 called");
        };
}
function SubClass() {
        trace("SubClass constructor called");
}
SuperClass.prototype.f3 = function() {
        trace("f3 called");
};
SubClass.prototype.__proto__=SuperClass.prototype
obj = new SuperClass();
trace("---------------");
obj.f1();
obj.f2();
obj.f3();
trace("******************************");
obj2=new SubClass();
trace("---------------");
obj2.f1();
obj2.f2();
obj2.f3();


iLoveYou 29.10.2003 20:33

Алексей, приятно разговаривать с человеком, который, по всей видимости, читал Дебройля :)
SubClass.prototype.__proto__=SuperClass.prototype -- объяснишь, как это работает?

Штрек 30.10.2003 18:04

Как это работает - Дебройль прекрасно и объяснил :
"Хитрость в том, что нужно сделать два класса и направить __proto__ прототипа первого на прототип другого (вместо Object.prototype). Таким образом вы получите "младший" класс, подкласс (SubClass) и "старший" класс, суперкласс (SuperClass). Делается это простой операцией:

SubClass.prototype.__proto__ = SuperClass.prototype;"

Нам же что бы найти F2 надо порыться не в прототипе
SuperClass, а в его конструкторе. Ну так и поройтесь,
чего притихли, где продолжение банкета?

iLoveYou 30.10.2003 18:47

Цитата:

Оригинал написал(а) Штрек
Как это работает - Дебройль прекрасно и объяснил :
"Хитрость в том, что нужно сделать два класса и направить __proto__ прототипа первого на прототип другого (вместо Object.prototype). Таким образом вы получите "младший" класс, подкласс (SubClass) и "старший" класс, суперкласс (SuperClass). Делается это простой операцией:
SubClass.prototype.__proto__ = SuperClass.prototype;"

ГЫ как там в анекдоте? "если бы это сказал ты, мне было бы приятней".

Цитата:

Нам же что бы найти F2 надо порыться не в прототипе
SuperClass, а в его конструкторе.
ага, в этой фразе есть смысл. я вижу, что мы приближаемся к ответу на первый вопрос. ура!

nuran 31.10.2003 10:58

Цитата:

Оригинал написал(а) Sergey"iLoveYou"
Techmaker, ты сейчас очень поднялся в моих глазах, говорю без всякой иронии. :)
:) Молодец Лёха. Как житуха? :):):) Учёба напрягает...

Штрек 31.10.2003 15:26

Ладно, раз Нуран сдался, мне то чего тянуться.
Подтягивай Серёга тяжелую артилерию.
Я так понял, ты котегор. не хочешь засовывать
метод f2 в прототип SuperClass, типа
SubClass.prototype.__proto__=SuperClass.prototype ;
SuperClass.prototype.f2=function() {
trace("f2 called");
};
Вариант
SubClass=SuperClass.prototype.constructor ;
тоже не проходит, при нём твою строчку
SubClass.prototype.__constructor__ = SuperClass;
можно вообще убрать, трэйсится будет что надо,
но механизм наследования не вырисовывается.
Я скажу по простому - инфы ни хрена нету ниде.
У Мука constructor - 15 строчек, у Дебройля - 2страницы Но даже не в этом дело.
Врубится бы чего ты написал
SubClass.prototype.__constructor__ = SuperClass;
Стыдно признаться не знаю что есть
__constructor__ :mad:
Ставлю
trace(SuperClass.prototype.__constructor__);
выводится undefined
Ставлю
trace(SuperClass.prototype.constructor);
выводится всё путём - [type Function]
В общем бардак.
Мож у нас на Руси Дебройли и есть, но тока куда то попрятались. Дембинского очень уважаю, так у него последнее обновление с год назад. Здесь на Флэшере уроков по ООП и близко нету.
Потрошитель уделил этому делу 10 строчек в глосарии.
Разбирайтесь мол сами.
Мож ничего не подсказывать, только чиркани, чем отличается
__constructor__ от constructor

iLoveYou 31.10.2003 17:49

Цитата:

Ладно, раз Нуран сдался, мне то чего тянуться.
а вот это неправильная позиция :rolleyes:
нуран не сдался, он даже не пытался.
Цитата:

Я так понял, ты котегор
кот Егор?
Цитата:

Стыдно признаться не знаю что есть
__constructor__
Мож ничего не подсказывать, только чиркани, чем отличается
__constructor__ от constructor
абсолютно ничего стыдного. :)
__constructor__ -- штука как бы недокументированная, но работает, как видишь. чтоб не нагружать тебя словесным бредом:
a=obj2.__constructor__; --> Ctrl+Alt+V ;)
мысль продолжим?

Techmaker 31.10.2003 18:36

2Штрек
 
Цитата:

Оригинал написал(а) Штрек
Врубится бы чего ты написал
SubClass.prototype.__constructor__ = SuperClass;
Стыдно признаться не знаю что есть
__constructor__
Ставлю
trace(SuperClass.prototype.__constructor__);
выводится undefined
Ставлю

Код:

SubClass.prototype.bla_bla = SuperClass;
trace(SubClass.prototype.bla_bla)

:D

iLoveYou 31.10.2003 18:43

ну-ка не хулигань тут! :) не видишь, конструктивная беседа завязалась? :cool:

Techmaker 31.10.2003 18:47

Повторный ответ на первый вопрс :)
 
Цитата:

Оригинал написал(а) Sergey"iLoveYou"

Цитата:

Нам же что бы найти F2 надо порыться не в прототипе
SuperClass, а в его конструкторе.

ага, в этой фразе есть смысл. я вижу, что мы приближаемся к ответу на первый вопрос. ура!

в конструкторе говорите? :) это как интерестно? :)
вот вариант, но метод f2 унаследовать всеровно не получится :)
Код:

SubClass.prototype.constructor.prototype.__proto__ = SuperClass.prototype.constructor.prototype;
мой ответ - решений нет :D можно только клонировать функцию, как я предложил в моём первом ответе:
Цитата:

Оригинал написал(а) Techmaker
Код:

...
SubClass=SuperClass;
...




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

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