Просмотр полной версии : 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.
в чем затык?
В том, что нельзя наследоваться от 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 наделить новыми свойствами и методами?
Ты можешь расширять только те классы, которые уже наследуются от 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:
Потому что две строки в конструкторе Gm неверны.
var q:Mcobj = stage.addChild(new Mcobj());
q.Some_fn();
Кстати, зачем такие жуткие названия классов, переменных и имена методов?
farmonol
18.01.2007, 20:11
а с мувиклипом mc что делать? мне нужно метод Some_fn() повесить на его экземпляр. Как мне прописать это?
Купи себе книжку колина мука, и 90% вопросов пропадут=)
farmonol
18.01.2007, 20:18
ну ребят, а форум для чего тогда?
знаю что незнаю
подскажите плиз
а с мувиклипом mc что делать? мне нужно метод Some_fn() повесить на его экземпляр. Как мне прописать это?
Ты можешь это сделать, объявив публичную переменную Some_fn типа Function. Но так не делают в AS3.
Ты можешь это сделать, объявив публичную переменную Some_fn типа Function. Но так не делают в AS3.
Что то мне подсказывает что так будут делать толпы дизайнеров=)
ну ребят, а форум для чего тогда?
знаю что незнаю
подскажите плиз
Ты меня спрашиваешь? хорошо скажу
этот форум для обсуждения Flash Platform'ы.
Твой пост, о основых ООП, связанная тема, но можно было бы и в гугле поискать статью, или почитать книжку.
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(); -> вот например
Как это осуществить? :(
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");
}
}
}
farmonol
19.01.2007, 16:57
спасибо за отличную идею!
То что ты делаешь, противоречит идеологии AS3.
если тебе нужен метод, ты создаешь в его классе, пасовать методы туда сюда это в ас1 было принято.
Если тебе нужно чтобы у загруженого мувика был какой то функционал, которого нету в самом мувике, ты просто грузишь в его в оболочку, и в оболочке есть то что нужно. или делаешь мувику поле manager, и после загрузки, присобачиваешь свой менеджер, и работаешь через него.
farmonol
19.01.2007, 19:33
То что ты делаешь, противоречит идеологии AS3.
если тебе нужен метод, ты создаешь в его классе, пасовать методы туда сюда это в ас1 было принято.
Если тебе нужно чтобы у загруженого мувика был какой то функционал, которого нету в самом мувике, ты просто грузишь в его в оболочку, и в оболочке есть то что нужно. или делаешь мувику поле manager, и после загрузки, присобачиваешь свой менеджер, и работаешь через него.
а что за оболочка имеется ввиду?:umnik2:
У тебя есть свф, с классом 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?
farmonol
19.01.2007, 21:52
спасибо Nirth, всё понял
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.