PDA

Просмотр полной версии : Error #2012: Obj_mc class cannot be instantiated.


farmonol
18.01.2007, 17:38
Имеется класс Gm :
package {
import flash.display.*;
import Obj_mc;

public class Gm extends MovieClip
{

public function Gm():void
{
var obj:Obj_mc = new Obj_mc();

}
}

и класс Obj_mc:

package
{
import flash.display.*;
import flash.events.*;

public class Obj_mc extends DisplayObject

{
public function Obj_mc() {


}
}

}
После компиляции получаю сообщение:
ArgumentError: Error #2012: Obj_mc class cannot be instantiated.

в чем затык?

etc
18.01.2007, 18:38
В том, что нельзя наследоваться от DisplayObject. Потому как это абстрактный класс.

DisplayObject is an abstract base class; therefore, you cannot call DisplayObject directly. Invoking new DisplayObject() throws an ArgumentError exception. All display objects inherit from the DisplayObject class. If you create a custom subclass of the DisplayObject class, it must extend a subclass of the DisplayObject class that has a valid new constructor.

farmonol
18.01.2007, 19:16
Не совсем понял что имеется ввиду здесь:
If you create a custom subclass of the DisplayObject class, it must extend a subclass of the DisplayObject class that has a valid new constructor.

Хорошо, допустим я создал экземпляр movieclip:

var obj:DisplayObject;
obj=inst.addChild(new mc);

как obj наделить новыми свойствами и методами?

etc
18.01.2007, 19:20
Ты можешь расширять только те классы, которые уже наследуются от DisplayObject.

farmonol
18.01.2007, 19:51
Ты можешь расширять только те классы, которые уже наследуются от DisplayObject.

Тогда делаю так:

package {
import flash.display.*;
import flash.filters.DisplacementMapFilter;

public dynamic class Gm extends Sprite
{
public function Gm():void
{
var q:Mcobj;
q=stage.addChild(new mc);

}
}

}


класс Mcobj:

package
{
import flash.display.*;

public dynamic class Mcobj extends Sprite
{
public function Mcobj():void
{
}

public function Some_fn():void {}
}
}
получаю ошибку:
TypeError: Error #1034: Type Coercion failed: cannot convert mc@1156431 to Mcobj

почему ругается на тип, если Mcobj наследуется от Sprite?
как мне в таком случае добавлять методы к экземпляру мувика?:umnik2:

etc
18.01.2007, 19:57
Потому что две строки в конструкторе Gm неверны.

var q:Mcobj = stage.addChild(new Mcobj());
q.Some_fn();

Кстати, зачем такие жуткие названия классов, переменных и имена методов?

farmonol
18.01.2007, 20:11
а с мувиклипом mc что делать? мне нужно метод Some_fn() повесить на его экземпляр. Как мне прописать это?

Nirth
18.01.2007, 20:16
Купи себе книжку колина мука, и 90% вопросов пропадут=)

farmonol
18.01.2007, 20:18
ну ребят, а форум для чего тогда?
знаю что незнаю
подскажите плиз

etc
18.01.2007, 20:26
а с мувиклипом mc что делать? мне нужно метод Some_fn() повесить на его экземпляр. Как мне прописать это?
Ты можешь это сделать, объявив публичную переменную Some_fn типа Function. Но так не делают в AS3.

Nirth
18.01.2007, 20:34
Ты можешь это сделать, объявив публичную переменную Some_fn типа Function. Но так не делают в AS3.
Что то мне подсказывает что так будут делать толпы дизайнеров=)

Nirth
18.01.2007, 20:35
ну ребят, а форум для чего тогда?
знаю что незнаю
подскажите плиз

Ты меня спрашиваешь? хорошо скажу
этот форум для обсуждения Flash Platform'ы.

Твой пост, о основых ООП, связанная тема, но можно было бы и в гугле поискать статью, или почитать книжку.

etc
18.01.2007, 20:43
Nirth, мое дело предложить :)

farmonol
19.01.2007, 13:03
Ты можешь расширять только те классы, которые уже наследуются от DisplayObject.

Ok. Sprite - дочерний класс по отношению к DisplayObject?
Хорошо, я делаю свой класс Obj_mc extends Sprite , расширяю его своими методами и свойствами.
У меня есть ранее определенный класс с мувиком:

[Embed(source="mc.swf",symbol="mc")]
public var mc2:Class;

теперь как мне расширить класс mc2 методами определенными в Obj_mc?

Иными словами в конце нужно получить возможность обращения к своим методам наравне с имеющимися в MovieClip:

Пример:


var tt:*=gm1.char_create(mc2,'mc');
tt.x = 200;
tt.y = 300;
tt.test(); -> вот например


Как это осуществить? :(

etc
19.01.2007, 14:25
Sprite — дочерний к DisplayObject.

Как ты думаешь, я могу понять, что такое tt, gm1, char_create, mc2, mc, test?

farmonol
19.01.2007, 15:16
Sprite — дочерний к DisplayObject.

Как ты думаешь, я могу понять, что такое tt, gm1, char_create, mc2, mc, test?

Извини, приведу код полностью.
Вызов из конструктора default класса:

package
{
import flash.display.*;

public class Default extends Sprite
{

[Embed(source="mc.swf",symbol="mc")]
public var mc2:Class;

public function Default():void
{
var gm1:Gm = new Gm(stage);
var tt:*=gm1.char_create(mc2,'mc');
tt.x = 200;
tt.y = 300;
tt.test();

}
}
}


Класс Gm c методом char_create() :

package {
import flash.display.*;
import flash.filters.DisplacementMapFilter;


public class Gm extends Sprite
{
public var inst:Object;

public function Gm(z:Object):void
{

inst = z;
}

// ф-ция отображения мувиков:

public function char_create(mc:Class,mc_name:String):*
{
var obj:Sprite;
obj=inst.addChild(new mc());
obj.name=mc_name;

return(obj);
}

// вот к примеру функция Test(), которая должна
// каким-то образом стать методом объекта tt (см.выше):

public function Test() {
trace("Hello World");
}
}
}

Nirth
19.01.2007, 16:48
советую пользоватся AS1

farmonol
19.01.2007, 16:57
спасибо за отличную идею!

Nirth
19.01.2007, 19:08
То что ты делаешь, противоречит идеологии AS3.

если тебе нужен метод, ты создаешь в его классе, пасовать методы туда сюда это в ас1 было принято.

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

farmonol
19.01.2007, 19:33
То что ты делаешь, противоречит идеологии AS3.

если тебе нужен метод, ты создаешь в его классе, пасовать методы туда сюда это в ас1 было принято.

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

а что за оболочка имеется ввиду?:umnik2:

Nirth
19.01.2007, 19:43
У тебя есть свф, с классом MyLoadee (мувик который будет загружатся, если не понятно из названия ;)


package display
{
public class MyLoadee
{
public function MyLoadee()
{
}
}


Я оставил его пустым, ты сам знаешь какие там должны быть методы.

Теперь в swf в который ты загружаешь у тебя есть класс MovieWrapper - оболочка. предположим, тебе нужна функция которая возвращает площадь мувика (ширина*высота)


package display
{
public class MovieWrapper
{
private var _managed:DisplayObject;
//это функционал
public function get area():Number
{
return managed.width*managed.height;
}

//это метод который обволакливает
public function wrap(managed:DisplayObject):DisplayObject
{
if(managed.parent != null)
{
managed.parent.removeChild(managed);
}
_managed = managed;
addChild(managed);
return managed;
}
}
}


кроме этих методов, те делегируешь и другие методы в управляемый класс

например, если тебе нужно добавлять туда мувики, можно написать в MovieWrapper:


override public function addChild(do:DisplayObject):DisplayObject
{
return _managed.addChild(do);
}


и тд и тп.

аналогично, когда менеджер это поле загруженого мувика, просто там наоборот.

farmonol
19.01.2007, 20:18
Ты имеешь ввиду сделать еще один класс extends от Sprite, добавить в него свои методы и на него addChild мувиклипа? А потом уже объект этого класса addChild на stage?

Nirth
19.01.2007, 20:23
именно

farmonol
19.01.2007, 21:52
спасибо Nirth, всё понял