Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Проблемы с имплементацией (http://www.flasher.ru/forum/showthread.php?t=157096)

in4core 31.05.2011 17:00

Проблемы с имплементацией
 
Что то я затупил маленько

Код AS3:

class Test extends Sprite implements ITest
 
interface Itest
 
function test():void
 
 
var a:ITest = new Test();
a.test(); // ok
a.x = 5 // failed

Не уж то ли нужно все оверрейдить а так же пихать в интерфейс?!

p.s. интерфейса для DisplayObject не нашел в помине

Jewelz 31.05.2011 17:05

унаследуй ITest от IBitmapDrawable

in4core 31.05.2011 17:08

interface Itest extends IBitmapDrawable // покажет такую же ошибку что и в прошлый раз.

CrazyFlasher 31.05.2011 17:09

можно например в интерфейсе сделать геттер, который будет возвращать себя самого типа DisplayObject.
Код AS3:

function get displayObject():DisplayObject;
...
public function get displayObject():DisplayObject{
      return this;
}

ну или просто в интерфейсе сделать
Код AS3:

function get x():Number;


in4core 31.05.2011 17:12

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

CrazyFlasher 31.05.2011 17:15

ну я в первом блоке кода указал как можно сделать

in4core 31.05.2011 17:21

CrazyFlasher а так делают вообще?
И что же это получается писать test.displayObject.x = 5 ? ужасть

-De- 31.05.2011 17:27

Если у класса/интерфейса нет какого-то метода/св-ва (у интерфейсов нет свойств, пичаль), то при попытке их дёрнуть будет фэйл. Ваш кэп.

CrazyFlasher 31.05.2011 17:28

Цитата:

у интерфейсов нет свойств
для этого есть геттеры и сеттеры

Jewelz 31.05.2011 17:30

Цитата:

Сообщение от in4core (Сообщение 1000095)
interface Itest extends IBitmapDrawable // покажет такую же ошибку что и в прошлый раз.

блин, точно, просто была похожая задача, я ее видимо тоже сначала так пытался решить, потом делал что-то типа такого:

Код AS3:

(a as DisplayObject).x


alatar 31.05.2011 17:43

Цитата:

Сообщение от in4core (Сообщение 1000098)
Не буду же я все методы спрайтовские заново переписывать. этож глупо

А в что глупого в написании интерфейса со всеми (хотя смысл описывать все методы?) методами?

etc 31.05.2011 17:43

Напиши интерфейс IDisplayObject, имплементи оба.

gloomyBrain 31.05.2011 18:24

ыыы... большой получился =)
Код AS3:

package {
 
        import flash.accessibility.AccessibilityProperties
        import flash.display.DisplayObject;
        import flash.display.DisplayObjectContainer;
        import flash.display.IBitmapDrawable;
        import flash.display.LoaderInfo;
        import flash.display.Stage;
        import flash.events.IEventDispatcher;
        import flash.geom.Point;
        import flash.geom.Rectangle;
        import flash.geom.Transform;
        import flash.geom.Vector3D;
        import flash.events.Event;
 
        [Event(name = "added", type = "flash.events.Event")]
        [Event(name = "addedToStage", type = "flash.events.Event")]
        [Event(name = "enterFrame", type = "flash.events.Event")]
        [Event(name = "exitFrame", type = "flash.events.Event")]
        [Event(name = "frameConstructed", type = "flash.events.Event")]
        [Event(name = "removed", type = "flash.events.Event")]
        [Event(name = "removedFromStage", type = "flash.events.Event")]
        [Event(name = "render", type = "flash.events.Event")]
 
        /**
        * Интерфейс объекта отображения
        *
        * @author gloomyBrain
        */

        public interface IDisplayObject extends IEventDispatcher, IBitmapDrawable {
 
        function get accessibilityProperties():AccessibilityProperties;
        function set accessibilityProperties(accessibilityProperties:AccessibilityProperties):void;
 
        function get alpha():Number;
        function set alpha(alpha:Number):void;
 
        function get blendMode():String;
        function set blendMode(blendMode:String):void;
 
        function get cacheAsBitmap():Boolean;
 
        function set cacheAsBitmap(cacheAsBitmap:Boolean):void;
 
        function get filters():Array;
        function set filters(filters:Array):void;
 
        function get height():Number;
        function set height(height:Number):void;
 
        function get loaderInfo():LoaderInfo;
 
        function get mask():DisplayObject;
        function set mask(mask:DisplayObject):void;
 
        function get mouseX():Number;
        function get mouseY():Number;
 
        function get name():String;
        function set name(name:String):void;
 
        function get opaqueBackground():Object;
        function set opaqueBackground(opaqueBackground:Object):void;
 
        function get parent():DisplayObjectContainer;
 
        function get root():DisplayObject;
 
        function get rotation():Number;
        function set rotation(rotation:Number):void;
 
                function get rotationX():Number;
        function set rotationX(rotation:Number):void;
 
                function get rotationY():Number;
        function set rotationY(rotation:Number):void;
 
                function get rotationZ():Number;
        function set rotationZ(rotation:Number):void;
 
        function get scale9Grid():Rectangle;
        function set scale9Grid(scale9Grid:Rectangle):void;
 
        function get scaleX():Number;
        function set scaleX(scaleX:Number):void;
 
        function get scaleY():Number;
        function set scaleY(scaleY:Number):void;
 
                function get scaleZ():Number;
        function set scaleZ(scaleZ:Number):void;
 
        function get scrollRect():Rectangle;
        function set scrollRect(scrollRect:Rectangle):void;
 
        function get stage():Stage;
 
        function get transform():Transform;
        function set transform(transform:Transform):void;
 
        function get visible():Boolean;
        function set visible(visible:Boolean):void;
 
        function get width():Number;
        function set width(width:Number):void;
 
        function get x():Number;
        function set x(x:Number):void;
 
        function get y():Number;
        function set y(y:Number):void;
 
                function get z():Number;
        function set z(z:Number):void;
 
        function getBounds(targetCoordinateSpace:DisplayObject):Rectangle;
 
        function getRect(targetCoordinateSpace:DisplayObject):Rectangle;
 
        function globalToLocal(point:Point):Point;
 
        function globalToLocal3D(point:Point):Vector3D;
 
        function hitTestObject(obj:DisplayObject):Boolean;
 
        function hitTestPoint(x:Number, y:Number, shapeFlag:Boolean = false):Boolean;
 
        function local3DToGlobal(point3d:Vector3D):Point;
 
        function localToGlobal(point:Point):Point;
 
        }
 
}


-De- 31.05.2011 18:36

Цитата:

Сообщение от in4core (Сообщение 1000098)
нужно чтобы все методы работали от спрайта + мои личные от интерфейса.

Код AS3:

var a:Test = new Test();

Кэп продолжает)

in4core 31.05.2011 18:40

нет кеп не продолжает. ))) Совсем не в тему )) Хотя понятно что работать будет, тока мне нужна имплементация полюбе

Добавлено через 37 секунд
gloomyBrain ты опасен!!! Есть какой то секрет как ты так быстро их все накидал? или ручками ручками?

i.o. 31.05.2011 18:48

Цитата:

Есть какой то секрет как ты так быстро их все накидал? или ручками ручками?
не понял проблемы что-то)

Wolsh 31.05.2011 18:58

Открываешь Модель класса в ФД (F4) и – вот тебе готовый интерфейс.
Но тут, согласен с Кэпом)) – сам подход неверен. Рекомендую перечитать основы про типы данных.
Речь то – о Типе переменной. Тип переменной ITest предполагает наличие у нее одного единственного метода. Делаете ДВЕ переменных, типа Спрайт (или Тест) и типа ITest, и используете их по ситуации – ссылка-то на один и тот же объект, только представленный кастингом как разные типы данных. От того, что Вы будете имплементить два Интерфейса, легче то не станет – переменную придется также кастовать, а значит всегда, когда Вы захотите добавить к ДО какую-то имплементацию одного единственного метода, Вам придется именно добавлять его к Интерфейсу IDisplayObject. Это ж никуда не годится. Смысл Интерфейса не только в гарантии наличия метода, но и в сокрытии ненужных.

i.o. 31.05.2011 19:04

Цитата:

тока мне нужна имплементация полюбе
а зачем, кстати?

-De- 31.05.2011 19:07

Цитата:

Сообщение от in4core (Сообщение 1000135)
нет кеп не продолжает. ))) Совсем не в тему )) Хотя понятно что работать будет, тока мне нужна имплементация полюбе

Test имплементирует и методы спрайта и интерфейс! Описания, что же надо - не в тему =\

PS: Кстати, меня вот бесит, что спрайт не унаследован от шейпа, потому без геморроя менять спрайт на шейп (когда нужно дёргать graphics) - низя =(

КорДум 31.05.2011 20:06

Цитата:

PS: Кстати, меня вот бесит, что спрайт не унаследован от шейпа, потому без геморроя менять спрайт на шейп (когда нужно дёргать graphics) - низя =(
Это вы о чем?

incvizitor 31.05.2011 20:32

Цитата:

Сообщение от etc (Сообщение 1000118)
Напиши интерфейс IDisplayObject, имплементи оба.

Ну все равне без геттера displayObject не обойтись. Например передать объект в addChild без этого не получится.

Цитата:

И что же это получается писать test.displayObject.x = 5 ? ужасть
Чем такой подход плох?

i.o. 31.05.2011 20:48

Код AS3:

class Test extends Sprite implements ITest
 
interface Itest
 
function test():void
 
 
var a:ITest = new Test();
a.test(); // ok
a['x'] = 5 // omg - it works!

полагаю, тема исчерпана.

incvizitor 31.05.2011 20:58

Цитата:

полагаю, тема исчерпана.
Я полагаю что нет. Такой подход - верный путь к RTE. К тому же проблему с addChild он не решает.

i.o. 31.05.2011 21:46

Цитата:

Я полагаю что нет. Такой подход - верный путь к RTE. К тому же проблему с addChild он не решает.
Уважаемый автор не уточняет, для чего ему вообще нужно это все в интерфейс впихивать. И по первому сообщению можно предположить, что
Код AS3:

a['x'] = 5

это именно то, что и требовалось.
Автор сам подметил, что он
Цитата:

затупил маленько
Так что данное решение, вполне оправдано, я считаю.

Котяра 31.05.2011 23:12

Темы про IDisplayObject и IDisplayObjectContainer

in4core 01.06.2011 13:32

i.o. Я поясню.

Смотрите такая вот ситуация

Код AS3:

function a(c:String):void {
 
 var m:IModule;
 
  switch ( c )
  case 'firstModule' :  m = new FirstModule();
  case 'secondModule' : m = new SecondModule();
}
}

Тоесть понятно что это можно решить написав var m:*; но это не круто. Можно так же воспользоваться например getDefinition , но меня заинтересовал именно такой вопрос , как я написал выше

-De- 01.06.2011 14:26

Сделать общий базовый клас Module, а не интерфейс.
PS: код пц. Фигурные скобки и break т.к.

in4core 01.06.2011 14:53

да я набросал не глядя ))) Как вариант супер класс можно


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

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