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

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

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

Регистрация: Aug 2009
Сообщений: 19
По умолчанию Как правильней проверить соответствие типа

Я хочу, чтобы некий класс A реализовывал интерфейс I и был Sprite.
У А будет много подклассов А1 А2 А3 (список расширяется), реализующих функции из I, при этом есть класс-манагер M, который эти A1 A2 ... создает в изобилии по требованию. Хотелось бы сделать поизящнее.
Первое что напрашивается:
- написать интерфейс I
- A extends Sprite implements I
- А1 extends A, А2 extends A, А3 extends A etc
- манагер M имеет переменную типа A и создает одного из A1-A2-A3 в зависимости от вызова и рулит какое-то время
Что не нравится: придется в A прописать пустые функци из I и в A1, A2, A3 постоянно override их, как-то не лежит душа. И вообще в этой схеме непонятно зачем нужен I, можно сразу прописать функции в A и override-ть их в А1 А2 А3, А в таком случае выполняет функцию абстрактного класса, для чего в AS3 интерфейсы и есть.

Если не писать интерфейс I и A, а напрямую делать A1 A2 A3, то это вообще паршиво - если программер делающий A4 A5 пропустит нужные функции, будет плохо.

Если не делать A, а напрямую реализовывать I в А1 А2 А3
А1 extends Sprite implements I
А2 extends Sprite implements I
то не совсем понятно, как проверить в M соответствие типа, если переменная для экземпляра будет типа Sprite, то нет гарантии, что в A5 реализовали I, если же переменная будет типа I, то для оперирования с этой переменной как со Sprite придется постоянно приводить тип, что тоже неизяЩно

Как бы тут поступить поООПшней?

Старый 14.08.2009, 14:53
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 2  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Код AS3:
if ((A1 is I) && (A1 is Sprite)) { .... }
__________________
Hell is the possibility of sanity

Старый 14.08.2009, 15:03
SorrowN00b вне форума Посмотреть профиль Отправить личное сообщение для SorrowN00b Найти все сообщения от SorrowN00b
  № 3  
Ответить с цитированием
SorrowN00b

Регистрация: Aug 2009
Сообщений: 19
Это понятно, это контроль при создании и throw error, мне просто лениво постоянно делать override и приводить тип
Код AS3:
(A1 as Sprite).x = 200
Вот я и ищу более кузявый путь, чтобы "сразу и само". Если вариантов нет, буду так как выше делать.

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

Регистрация: Jan 2009
Сообщений: 1,651
вы об этом что ли?
Код:
var interfaceInstance:I = A1 as I;
interfaceInstance.x=200;

Старый 14.08.2009, 15:57
SorrowN00b вне форума Посмотреть профиль Отправить личное сообщение для SorrowN00b Найти все сообщения от SorrowN00b
  № 5  
Ответить с цитированием
SorrowN00b

Регистрация: Aug 2009
Сообщений: 19
Вово, тыща временных foo
Код AS3:
var foo:I = A1 as Sprite;
И вечные override method1, override method2 в A1 A2 не нравятся.
И контроля типа на уровне компиляции нет.
И интерфейс I в таком случае просто не нужен ни в каком разрезе.
Вот есть способ сделать сразу и все? Если нет, я смирюсь

Вот если б в интерфейсе можно было бы писать, что его имплементоры обязаны наследовать от Sprite вот это было бы оно, как мне кажется.


Последний раз редактировалось SorrowN00b; 14.08.2009 в 16:00.
Старый 15.08.2009, 11:09
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 6  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Цитата:
Сообщение от SorrowN00b Посмотреть сообщение
Как бы тут поступить поООПшней?

Вариант первый: Вам придется оверрайдить методы в подклассах, расширяющих A и не использовать интерфейс I вовсе. Следить за тем, чтобы методы были заоверрайдены придется вручную. На этапе компиляции это не удастся отследить. Инстансы A1, A2...AN будут иметь тип A.

A extends Sprite
А1 extends A
А2 extends A
А3 extends A
Код:
class A extends Sprite {
	public virtual function doSomething():void {
		throw new IllegalOperationError('Method must be overrided by subclass');
	}
}

А1 extends A {
	public override function doSomething():void {
		trace('Hello, I am А1');
	}
}

А2 extends A {
	public override function doSomething():void {
		trace('Hello, I am А2');
	}
}

class M {

    public function M() {
        this.doJob();
    }

    public function doJob():void {
        var className:String = 'A' + int(Math.random() * 2) + 1;
        var c:Class = getDefinitionByName(className) as Class;
		    var instance:A = new c() as A;
        instance.x = 100;
        instance.doSomethimg();
    }
}
Второй вариант: имплементить интерфейс I во всех классах (A1, A2, A3) и работать с типом интерфейса.

Интерфейсы позволяют единообразно оперировать с экземплярами совершенно разных типов, не имеющих в иерархии их классов общего суперкласса. При этом экземпляр приобретает тип интерфейса.

Для этого варианта в I должны быть описаны _все_ геттеры/сеттеры и методы, через которые предполагается работать с экземпляром.

Опишите в I все проперти и методы Sprite с которыми собираетесь работать, а также методы и проперти, реализуемые во всех A1, A2...AN. Для code reusing полезно отекстендить I от ISprite.

А1 extends Sprite implements I
А2 extends Sprite implements I
А3 extends Sprite implements I

Код:
А1 extends Sprite implements I {
	public function doSomething():void {
		trace('Hello, I am А1');
	}
}

А2 extends Sprite implements I {
	public function doSomething():void {
		trace('Hello, I am А2');
	}
}

public interface ISprite {
	// DisplayObject implementation
  function set x(value:Number):void;
  function get x():Number;
}

public interface I extends ISprite {
  function doSomething():void;
}


class M {

    public function M() {
        this._factory = new AFactory();
        this.doJob();
    }

    private var _factory:  IIFactory;

    public function doJob():void {
        var className:String = 'A' + int(Math.random() * 2) + 1;
        var instance:I = this._factory.newInstance(className);
        if (instance != null) {
        	instance.x = 100;
        	instance.doSomethimg();
        }
    }
}

internal class AFactory implements IIFactory {
		public function newInstance(className:String):I {
        try {
				    var c:Class = getDefinitionByName(className) as Class;
				    var instance:I = new c() as I;
				    return instance;
				} catch (e:TypeError) {
				    return null;
				}
		}
}
Код:
public interface IIFactory {
  function newInstance(className:String):I;
}
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

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

Регистрация: Aug 2009
Сообщений: 19
Ну, это все понятно, не стоило утруждаться так все подробно расписывать, спасибо за ваше время
Во втором варианте, конечно, напрягает следующее:
Цитата:
Опишите в I все проперти и методы Sprite с которыми собираетесь работать
Короче, я в пролете, будем оверрайдить.

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

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

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


 


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


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