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

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

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

Регистрация: Jun 2006
Сообщений: 15
По умолчанию Пример из документации не работает(getDefinitionByName)

захотел я использовать reflection api,
но нет тут то было)

сначала долго удивлялся куда getClassByName делся
оказадось что переименовали в getDefinitionByName.

ладно берем пример из доки:

Код:
package {
    import flash.display.DisplayObject;
    import flash.display.Sprite;
    import flash.utils.getDefinitionByName;

    public class GetDefinitionByNameExample extends Sprite {
        private var bgColor:uint = 0xFFCC00;
        private var size:uint = 80;

        public function GetDefinitionByNameExample() {
            var ClassReference:Class = getDefinitionByName("flash.display.Sprite");
            var instance:Object = new ClassReference();
            instance.graphics.beginFill(bgColor);
            instance.graphics.drawRect(0, 0, size, size);
            instance.graphics.endFill();
            addChild(DisplayObject(instance));
        }
    }
}
НЕ компилируеться!!

говорит
Implicit coercion of a value with static type Object to a possibly unrelated type Class.
на
Код:
 var instance:Object = new ClassReference();
даже пробывал выключать strict режим в компиляторе.
не помогает(

может это только у меня или это ошибка Flex?

Старый 22.06.2006, 12:37
fishbounce вне форума Посмотреть профиль Отправить личное сообщение для fishbounce Посетить домашнюю страницу fishbounce Найти все сообщения от fishbounce
  № 2  
Ответить с цитированием
fishbounce

Регистрация: Dec 2003
Адрес: Москва
Сообщений: 176
В документации getDefinitionByName возвращает не Class, а Object.
Пиши
Код:
var ClassReference : Object = getDefinitionByName("flash.display.Sprite");
и все будет нормально.
А пример они, наверное, забыли поменять с прошлой версии.

Хотя, конечно, то, что getDefinitionByName возвращает Object, а не Class довольно странно.
Причем если написать
Код:
var ClassReference : Class = Class(getDefinitionByName("flash.display.Sprite"));
все тоже будет работать. И выглядит такая запись, на мой взгляд, корректней.
НО: почему работает Class( instanceObject ) не совсем понятно, т.к. Class -> Object, т.е. Class - наследник Object, и должен работать кастинг только вверх, т.е. Object( instanceClass ). Видимо, какой-то косяк здесь


Последний раз редактировалось fishbounce; 22.06.2006 в 12:47.
Старый 22.06.2006, 13:09
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 3  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Цитата:
Сообщение от tyombria
Хотя, конечно, то, что getDefinitionByName возвращает Object, а не Class довольно странно.
ОК, представь, что ты хочешь написать какой-либо метод, возвращающий какой-либо класс. Ты пишешь:
Код:
public function getClass(className:String):[и вот здесь ты что будешь писать? Class? А если другой класс?]
Все классы -- наследники Object, ты можешь без проблем писать тип как супер-класс, без проблем, потому что Class содержит все свойства Object. Ничего удивительного в этом нет.

Class конечно наследник Object, он его расширяет. Кастинг работает вниз, а не вверх. У Object есть базовые свойства, ты кастуешь Object к Class-у (а не наоборот, иначе свойства и методы ты не получишь), чтобы дать понять компилятору, с объектом какого типа он имеет дело (тебе же нужен не абстрактный Object, как результат функции, а конкретный класс).

Старый 22.06.2006, 13:01
redbaron вне форума Посмотреть профиль Отправить личное сообщение для redbaron Найти все сообщения от redbaron
  № 4  
Ответить с цитированием
redbaron

Регистрация: Jun 2006
Сообщений: 15
спасибо!

Старый 22.06.2006, 13:43
fishbounce вне форума Посмотреть профиль Отправить личное сообщение для fishbounce Посетить домашнюю страницу fishbounce Найти все сообщения от fishbounce
  № 5  
Ответить с цитированием
fishbounce

Регистрация: Dec 2003
Адрес: Москва
Сообщений: 176
Погоди...
Что значит "что будешь писать? Class? А если другой класс?"?
Любой класс is Class.
В том, что Class содержит все свойства Object я не сомневаюсь, т.к. Class наследник Object.
Я все-таки настаиваю, что кастинг всегда работает вверх (возможно, мы путаемся в терминологии, но я исхожу из термина upcasting (http://bruceeckel.by.ru/tij/Chapter01.html#Heading28)). Кастинг может сработать и вниз, но не всегда. И в данном случае, когда мы преобразуем объект Object, возвращаемый в getDefinitionByName, в объект Class (это как раз случай преобразования вниз, к наследнику), не возникает исключения, потому что, видимо, этот Object на самом деле есть Class. Не зря ведь в документации опечатка, потому что раньше так и было - возвращался Class.
Попробуй преобразовать "чистый" Object в Sprite (преобразование вниз, в моей терминологии) - ничего не выйдет.
Возможно, я что-то недопонимаю... если так, то объясни, пожалуйста.

Старый 22.06.2006, 13:55
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 6  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Цитата:
Сообщение от tyombria
Что значит "что будешь писать? Class? А если другой класс?"?
Любой класс is Class.
Приведи пример. При этом в аргументе функции может быть любой класс.

Преобразования из супер-класса в наследника нет, есть только проверка соответствия объекта какому-либо классу. Конструкция AnyClass(anyObject) лишь даёт понять компилятору, с объектом какого типа он имеет дело. Такая конструкция не преобразовывает объект, а лишь проверяет, является-ли anyObject объектом типа AnyClass. Если нет, то вернёт null. Если да -- вернёт тип AnyClass и тогда компилятор может использовать в этом объекте все свойства AnyClass.

Старый 22.06.2006, 14:52
fishbounce вне форума Посмотреть профиль Отправить личное сообщение для fishbounce Посетить домашнюю страницу fishbounce Найти все сообщения от fishbounce
  № 7  
Ответить с цитированием
fishbounce

Регистрация: Dec 2003
Адрес: Москва
Сообщений: 176
С тем, что преобразование, как таковое не идет, я согласен. Это кто как говорит (смысл один): приведение, кастинг, преобразование (согласен, не самое лучшее).
С тем что любой класс is Class я погорячился, а точнее, запутался... Потому что по-дурацки сделано в as. Логичней было бы, писать не так:
Код:
var ClassRef : Class = Class( getDefinitionByName(name) );
var instance : Object = new ClassRef();
a так:
Код:
var ClassRef : Class = Class( getDefinitionByName(name) );
var instance : Object = ClassRef.newInstance();
А по поводу того, что getDefinitionByName может возвратить что-нибудь отличное от Class мне все равно не понятно. Т.к. он по-любому (должен) возвращает объект Class, который содержит все необходимые вещи для создания объекта того класса, который мы указали в аргументе name.


Последний раз редактировалось fishbounce; 22.06.2006 в 14:55.
Старый 22.06.2006, 15:03
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 8  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Функция getDefinitionByName возвращает тип Object, т.к. не знает, какого типа возвращаемый ею объект, что и понятно. А тебе нужно получить объект заданного типа и я не вижу ничего такого дурацкого в том, что ты просто объясняешь компилятору, объект какого типа возвращает функция. И если имя класса, переданное в аргументе функции верное (т.е. такой класс существует), то проверка AnyClass(getDefinituonByName(name)); вернёт заданный тип, а не null. Впрочем, я это уже говорил выше.

Что касается логики написания ClassRef.newInstance(); вместо new ClassRef();, то я не вижу логики. Можно написать что-то вроде
Код:
public static function newInstance():AnyClass {
    return new AnyClass();
}
и писать AnyClassRef.newInstance();, только смысла в этом никакого не вижу.

Старый 22.06.2006, 15:12
7thsky™ вне форума Посмотреть профиль Отправить личное сообщение для 7thsky™ Найти все сообщения от 7thsky™
  № 9  
Ответить с цитированием
7thsky™
Flash Aксакал
 
Аватар для 7thsky™

Регистрация: Jun 2005
Сообщений: 636
var c:Object = new ClassFactory ('mx.controls.Button').newInstance ()

Старый 22.06.2006, 15:13
7thsky™ вне форума Посмотреть профиль Отправить личное сообщение для 7thsky™ Найти все сообщения от 7thsky™
  № 10  
Ответить с цитированием
7thsky™
Flash Aксакал
 
Аватар для 7thsky™

Регистрация: Jun 2005
Сообщений: 636
это было адресованно tyombria

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

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

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


 


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


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