PDA

Просмотр полной версии : Создание объекта класса внутри этого класса


КорДум
17.03.2010, 14:48
И снова здравствуйте, возникла необходимость из класса создать объект этого же класса и разместить его на сцене. Вот такая рекурентная штука. Это возможно?

nOobCrafter
17.03.2010, 14:52
Создать экземпляр можно внутри себя можно, почему нет? А если не секрет зачем это вобще надо?

КорДум
17.03.2010, 14:56
Решил поразвлечь себя и понапридумывать нестандартные ситуации - мало ли когда понадобятся. Положил эту ситуацию на реальный пример: объект рыба, она размножается, кхм, делением. Да, делением. И вот нужно прописать в классе рыбы создание такой же второй рыбы. Именно в классе рыбы.
Значит можно, ага. А напишите, пожалуйста, пример такой реализации?

iNils
17.03.2010, 14:59
package {
public class Fish {
public function Fish () {

}
public function spawning ():Fish {
return new Fish ();
}
}
}

КорДум
17.03.2010, 14:59
Спасибо большое, то, что нужно

Kuruki
17.03.2010, 15:00
Объекты не должны размножаться сами. Как вы будете это контролировать? Например, вам понадобится удалить всю рыбу. ?
Имхо, бредовая идея

КорДум
17.03.2010, 15:03
Ссылка на рыбу добавляется в массив главного класса. Разве по ней удалить рыбу нельзя?

Kuruki
17.03.2010, 15:07
Так вот он и должен добавлять рыбу

nOobCrafter
17.03.2010, 15:08
имхо лучше диспетчить ивент что бы ктото сверху делал свою работу.. опять же так же повышается возможности контроля.

Котяра
18.03.2010, 16:21
обычно реализация метода clone в классе как раз и создаёт объект типа Класс

iNils
18.03.2010, 20:40
обычно реализация метода clone в классе как раз и создаёт объект типа КлассКлон это несколько другое.

Котяра
18.03.2010, 23:24
Вопрос был: "возможно ли в классе создать экземпляр класса". я сказал - да, более того: так практически всегда поступают если нужно определить метод клонирования.

iNils
18.03.2010, 23:40
Вопрос был: "возможно ли в классе создать экземпляр класса". я сказал - да, более того: так практически всегда поступают если нужно определить метод клонирования.А где в вопросе было упомянуто клонирование? Клонирование, это когда мы получаем новый экземпляр с тем же свойствами, что и у оригинала.

Котяра
19.03.2010, 11:06
блин.. Клонирование я упомянул, как пример создания экземпляра класса внутри класса. Т.е. был вопрос: "так можно?". Я ответил : "Да - причём, так поступают очень часто, например, при клонировании.":wacko:
по сути самого топика: тоже можно сделать через клонирование.
ParentClass{
private var childList:IClonable //детки
...
// добавляем листенер на клик
private function initChild(child:IClonable ):void
{
addChild(child);
child.addEventListener(MouseEvent.CLICK,cloneChild);
// и меняем например, координаты
child.x=0;
child.y=0;
}
...
// клонируем
private function cloneChild(e):void
{
var child:IClonable = e.target as IClonable ;
var cloneChild: IClonable = child.clone();
initChild(cloneChild);
}

}
в случае размножения так даже занятнее будет.. если например в методе клонирования сделать не полный дубликат а с каким-нибудь небольшим рандомным отклоненинием.. все следующие поколения могут накапливать это отклонение и если сделать еще смерть экземпляра зависящим от набора характеристик будет весело. )))
например: у объектов есть генетические параметры width/height/speed. кроме того есть время жизни/интервал размножения и случайный вектор направления.
на поле появляется еда которую едят рыбы ( наверное больше под абстракцию подходит микроорганизмы, размножающиеся делением).
время жизни напрямую зависит от времени и количества съеденной еды - голодные умирают. живые размножаются)
количество съеденой еды зависит от скорости и габаритов. но можно ввести обратную связь - для большого тела надо больше еды.. для более быстрых тоже.. коэффициенты всякие тоже можно сделать наследуемыми с мутациями..
Академический интерес: варируя разные генетические коэффициенты и параметры окружающей среды посмотреть какая популяция получится.)))

package
{
public class Ameba implements IClonable {
...
public function clone(): Ameba
{
var cloned:Ameba = new Ameba()
cloned.speed = this.speed+Math.random()*deltaSpeed-deltaSpeed/2;
cloned.width= this.width+Math.random()*deltaWidth-deltaWidth/2;
//...итп

return cloned;
}

martende
29.03.2010, 18:37
самый типичный пример ето Event::clone , так что вопрос, отнюдь, не чисто теоретический.

Elser
30.03.2010, 22:12
создавать экземпляр класса в нем самом нельзя только в конструкторе и методах, вызываемых из конструктора
создавать экземпляр класса в нем самом можно только после того как создающий экземпляр полностью создан сам

zuxul
31.03.2010, 09:56
создавать экземпляр класса в нем самом нельзя только в конструкторе и методах, вызываемых из конструктора
создавать экземпляр класса в нем самом можно только после того как создающий экземпляр полностью создан сам
Неправда...
Еще как можно, главное обеспечить конец рекурсивного вызова.

Elser
31.03.2010, 14:32
можно и воду в решете носить
ну вызовите вы сколько надо рекурсивно конструктор, а дальше
как вы вернете на верхний уровень ссылки на созданные объекты?
ибо столкнетесь с чем то подобным:

package {
import flash.display.MovieClip;
public class seq extends MovieClip{
public function seq(num:Number, ar:Array){
super();
if( num > 0 ) {
var ns:seq = new seq(num - 1, ar);
// надо передать конструктору массив инстансов уже содержащий инстанс созданый ЭТИМ ЖЕ конструктором
ar.push(ns);
// а в массив надо добавить объект созданый конструктором, которому передан массив с уже добавленым ЭТИМ ЖЕ объектом
// и каждая из этих строк какбы должа выполниться перед другой
}
}
}
}

а в свете того что конструктор не может возвращать значение это сделать либо не реально либо бессмыслено

zuxul
31.03.2010, 17:44
Плохо понял, что Вы хотели сказать примером кода...но может быть так будет работать?package {
import flash.display.MovieClip;
public class seq extends MovieClip{
public function seq(num:Number, ar:Array){
super();
if( num > 0 ) {
ar.push(this);
var ns:seq = new seq(num - 1, ar);
// надо передать конструктору массив инстансов уже содержащий инстанс созданый ЭТИМ ЖЕ конструктором
// ar.push(ns);
// а в массив надо добавить объект созданый конструктором, которому передан массив с уже добавленым ЭТИМ ЖЕ объектом
// и каждая из этих строк какбы должа выполниться перед другой
}
}
}
}
Реально это или бессмыслено? :). Вы же сами "почти" привели код, с помощью которого вернули ссылки на верхний уровень.