Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 17.05.2012, 15:40
Vishapakahr вне форума Посмотреть профиль Отправить личное сообщение для Vishapakahr Найти все сообщения от Vishapakahr
  № 1  
Ответить с цитированием
Vishapakahr

Регистрация: Apr 2009
Адрес: Armenia , Yerevan
Сообщений: 145
По умолчанию Полиморфизм с интерфейсом.

Здравствуйте уважаемые флешеры опять возникла проблема, а он заключается в следующем. Есть у меня несколько классов, в основном наследованы от UIComponent и выполняют интерфейс ILineDragger.

Код AS3:
package DigitalVanillaCorp.interfaces
{
	import com.mc.Math.Vector2D;
 
	import flash.events.IEventDispatcher;
	import flash.geom.Rectangle;
 
	import mx.core.ILayoutElement;
	import mx.core.IUIComponent;
	import mx.core.IVisualElement;
 
	public interface ILineDragger extends IEventDispatcher,IUIComponent,ILayoutElement<font color="Red">//тут нужен еще и наследование от IVisualElement чтобы добавлять его с помощью addElement
	{
		function set v0(value:Vector2D):void;
		function get v0():Vector2D;
 
		function set v1(value:Vector2D):void;
		function get v1():Vector2D;
 
		function set vdif(value:Vector2D):void;
		function get vdif():Vector2D;
 
		/*function set x(value:Number):void;
		function get x():Number;
 
		function set y(value:Number):void;
		function get y():Number;
 
		function set name(value:String):void;
		function get name():String;
 
		function set rotation(value:Number):void;
		function get rotation():Number;
		*/
		function startDrag(lockCenter:Boolean=false,bounds:Rectangle = null):void;
		function stopDrag():void;
 
 
 
		//function move(x:Number,y:Number):void;
 
		function updateV0():void;
	}
}
И так , проблема в том что кагда одновременно наследую IUIComponent и IVisualElement то он приводит в конфликт с некоторомы общими сеттер геттерами , например x,y ... . Как мне использовать оба так чтобы избежать конфликта ? на данный момент использую только IUIComponent, а при добовлении на сцену для всех использую

Код AS3:
var vertexPol:ILineDragger = new VertexOfPolygon;
addElement(vertexPol as IVisualElement);
 
var lineDragger:ILineDragger = new LineDragger;
addElement(lineDragger as IVisualElement);
И так мне нужно избежать присвоения типа на IVisualElement.
__________________
Urartu is a neoHittite and ProtoArmenian kingdom !!

Старый 17.05.2012, 16:01
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 2  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
Код AS3:
var vertexPol:ILineDragger = new VertexOfPolygon;
addElement(vertexPol as IVisualElement);
 
var lineDragger:ILineDragger = new LineDragger;
addElement(lineDragger as IVisualElement);
Так не логичнее?
Код AS3:
var vertexPol:VertexOfPolygon = new VertexOfPolygon;
addElement(vertexPol);
 
var lineDragger:LineDragger = new LineDragger;
addElement(lineDragger);
Всмысле, если _последний_ код у Вас не компилируется, то значит lineDragger as IVisualElement возвращает null и _первый_ код компилируется только поэтому.

Если интефейсы конфликтуют, есть (только) 2 пути решения:
- изенить один из них (если Ваш, а не библиотечный) и проправить всех, кто его реализовывал
- вынести на объекте, который нужно передать как IVisualElement, поле "get visual():IVisualElement".
А потом отдавать внутренний объект, который этот интерфейс реализовал, как-то так:
Код AS3:
var dragger:LineDragger = new LineDragger();
var lineDragger:ILineDragger = dragger;
var visualElement:IVisualElement = dragger.visual;
addElement(visualElement);
Кода для взаимодействия внутреннего объекта IVisualElement и LineDragger придётся написать порядочно, но друго решения не знаю.

В C# с пересечением интерфейсов борются конкретицацией интерфейса при вызове метода. А в as3 только аккуратным именованием этих методов.


Последний раз редактировалось expl; 17.05.2012 в 16:04.
Старый 17.05.2012, 16:01
Vishapakahr вне форума Посмотреть профиль Отправить личное сообщение для Vishapakahr Найти все сообщения от Vishapakahr
  № 3  
Ответить с цитированием
Vishapakahr

Регистрация: Apr 2009
Адрес: Armenia , Yerevan
Сообщений: 145
ах да еще и

Код AS3:
function startDrag(lockCenter:Boolean=false,bounds:Rectangle = null):void;
		function stopDrag():void;
Что наследовать чтобы эти двое были там (и не только). Они как бы прелести от DisplayObject

Добавлено через 3 минуты
expl , вы знаете что такое полиморфизм ? и потом addElement(lineDragger as IVisualElement); работает отлично. Я лишь говорю о том чтобы наследовать там интерфейс IVisualElement и избежать присвоения типа.

Добавлено через 7 минут
Код AS3:
private var iLineDraggers:Vector.<ILineDragger> = new Vector.<ILineDragger>;
for (var i:int = 0; i < iLineDraggers.length; i++) 
				{
					iLineDraggers[i].updateV0();
				}
Тут используется метод updateV0().
__________________
Urartu is a neoHittite and ProtoArmenian kingdom !!

Старый 17.05.2012, 16:44
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 4  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
expl , вы знаете что такое полиморфизм ? и потом addElement(lineDragger as IVisualElement); работает отлично. Я лишь говорю о том чтобы наследовать там интерфейс IVisualElement и избежать присвоения типа.
Под полиморфизмом я всегда понимал возможность существования разных реализаций за одним и тем же интерфейсом (просто чтобы убедиться, что говорим об одном и том же).

Но я не понимаю:
- класс VertexOfPolygon реализует интерфейс ILineDragger.
- ILineDragger и _не_ может отнаследоваться от IVisualElement из-за конфилктов в сигнатуре пары одноименных методов
- т.к. VertexOfPolygon реализует ILineDragger, то он впринципе должен иметь все методы, там описанные, а эти методы конфликтуют с IVisualElement
- Так как может получиться, что VertexOfPolygon реализует интерфейс IVisualElement, ашник
(lineDragger as IVisualElement != null)?!


Последний раз редактировалось expl; 17.05.2012 в 16:47.
Старый 17.05.2012, 16:56
Vishapakahr вне форума Посмотреть профиль Отправить личное сообщение для Vishapakahr Найти все сообщения от Vishapakahr
  № 5  
Ответить с цитированием
Vishapakahr

Регистрация: Apr 2009
Адрес: Armenia , Yerevan
Сообщений: 145
Цитата:
Сообщение от expl Посмотреть сообщение
(lineDragger as IVisualElement != null)?!
Нет. Потомучто это зависит что присвоиваешь к lineDragger , а на данном случае он лехко присвоивается в IVisualElement.
__________________
Urartu is a neoHittite and ProtoArmenian kingdom !!

Старый 17.05.2012, 17:32
Bgg вне форума Посмотреть профиль Отправить личное сообщение для Bgg Найти все сообщения от Bgg
  № 6  
Ответить с цитированием
Bgg
 
Аватар для Bgg

Регистрация: Jan 2009
Адрес: Петерсбург
Сообщений: 1,882
Не понятно что хотите услышать. Перегрузки методов в as3 нет, поэтому сигнатура у метода может быть только одна.

Старый 17.05.2012, 18:15
stweet вне форума Посмотреть профиль Отправить личное сообщение для stweet Найти все сообщения от stweet
  № 7  
Ответить с цитированием
stweet
 
Аватар для stweet

Регистрация: Mar 2010
Адрес: 54.713862552265084 = 20.442724227905273
Сообщений: 449
Отправить сообщение для stweet с помощью Skype™
Используйте композицию, что вы из объекта склад делаете?!...
__________________
Спросишь, дурак на минуту. Если не спросишь, дурак на всю жизнь!

Старый 17.05.2012, 18:19
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 8  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
Сообщение от Vishapakahr Посмотреть сообщение
Нет. Потомучто это зависит что присвоиваешь к lineDragger , а на данном случае он лехко присвоивается в IVisualElement.
Еще раз всётки пройдемся:

Вот конкретный Ваш пример кода:
Код AS3:
var lineDragger:ILineDragger = new LineDragger;
Если LineDragger не ILineDragger, - то просто не скомпилируется.

ILineDragger _не_ просто _не_ реализует IVisualElement, он его _не_ может реализовать из-за конфликтов (это правильно я понял?)

Покажите код чтоли LineDragger-а, и каким чудом ему удается одновременно реализовать IVisualElement и IViewElement.

Не верю я, что "as" волшебным образом убирает конфликты (этот оператор ведь не может "на лету" заставить класс реализовать интерфейс, если его скомпилировали без последнего)

Старый 17.05.2012, 20:10
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 9  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
как я понял проблема в том что и там и там есть
Код AS3:
function get x();
выход: убрать из ILineDragger эти геттеры или

Код AS3:
ILineDragger extends IVisualElement
__________________
Отряд Котовскага

Старый 17.05.2012, 21:43
Vishapakahr вне форума Посмотреть профиль Отправить личное сообщение для Vishapakahr Найти все сообщения от Vishapakahr
  № 10  
Ответить с цитированием
Vishapakahr

Регистрация: Apr 2009
Адрес: Armenia , Yerevan
Сообщений: 145
Цитата:
Сообщение от expl Посмотреть сообщение
Еще раз всётки пройдемся:

Вот конкретный Ваш пример кода:
Код AS3:
var lineDragger:ILineDragger = new LineDragger;
Если LineDragger не ILineDragger, - то просто не скомпилируется.

ILineDragger _не_ просто _не_ реализует IVisualElement, он его _не_ может реализовать из-за конфликтов (это правильно я понял?)

Покажите код чтоли LineDragger-а, и каким чудом ему удается одновременно реализовать IVisualElement и IViewElement.

Не верю я, что "as" волшебным образом убирает конфликты (этот оператор ведь не может "на лету" заставить класс реализовать интерфейс, если его скомпилировали без последнего)
вот LineDragger который выполняет ILineDragger

Код AS3:
<?xml version="1.0" encoding="utf-8"?>
<s:Button xmlns:fx="http://ns.adobe.com/mxml/2009"
		  xmlns:s="library://ns.adobe.com/flex/spark"
		  xmlns:mx="library://ns.adobe.com/flex/mx"
		  creationComplete="button1_creationCompleteHandler(event)"
		  skinClass="DigitalVanillaCorp.skins.LineDraggerBtnSkin" toolTip="click to start dragging"
		  implements="DigitalVanillaCorp.interfaces.ILineDragger">
	<fx:Script>
		<![CDATA[
			import com.mc.Math.Vector2D;
 
			import mx.events.FlexEvent;
 
			protected function button1_creationCompleteHandler(event:FlexEvent):void
			{
				// TODO Auto-generated method stub
 
			}
 
			private var _v0Local:Vector2D;
 
			private var _v0:Vector2D;
			public function set v0(value:Vector2D):void 
			{
				_v0 = value;
			}
			public function get v0():Vector2D {return _v0;}
 
			private var _v1:Vector2D;
			public function set v1(value:Vector2D):void 
			{
				_v1 = value;
			}
			public function get v1():Vector2D {return _v1;}
 
			private var _vdif:Vector2D;
			public function set vdif(value:Vector2D):void 
			{
				_vdif = value;
 
				var endv:Vector2D = v0.addedTo(_vdif.multipliedBy(0.5));
				move(endv.x,endv.y);
			}
			public function get vdif():Vector2D {return _vdif;}
 
			public function updateV0():void
			{
				v0 = new Vector2D(x,y);
			}
 
		]]>
	</fx:Script>
	<fx:Declarations>
		<!-- Place non-visual elements (e.g., services, value objects) here -->
	</fx:Declarations>
 
 
</s:Button>
__________________
Urartu is a neoHittite and ProtoArmenian kingdom !!

Создать новую тему Ответ Часовой пояс GMT +4, время: 13:27.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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