![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|
|
|||||
|
Регистрация: Jun 2006
Сообщений: 15
|
захотел я использовать 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. на даже пробывал выключать strict режим в компиляторе. не помогает( может это только у меня или это ошибка Flex? |
|
|||||
|
Регистрация: Dec 2003
Адрес: Москва
Сообщений: 176
|
В документации getDefinitionByName возвращает не Class, а Object.
Пиши и все будет нормально. А пример они, наверное, забыли поменять с прошлой версии. Хотя, конечно, то, что getDefinitionByName возвращает Object, а не Class довольно странно. Причем если написать все тоже будет работать. И выглядит такая запись, на мой взгляд, корректней. НО: почему работает Class( instanceObject ) не совсем понятно, т.к. Class -> Object, т.е. Class - наследник Object, и должен работать кастинг только вверх, т.е. Object( instanceClass ). Видимо, какой-то косяк здесь ![]() Последний раз редактировалось fishbounce; 22.06.2006 в 12:47. |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Цитата:
public function getClass(className:String):[и вот здесь ты что будешь писать? Class? А если другой класс?] Class конечно наследник Object, он его расширяет. Кастинг работает вниз, а не вверх. У Object есть базовые свойства, ты кастуешь Object к Class-у (а не наоборот, иначе свойства и методы ты не получишь), чтобы дать понять компилятору, с объектом какого типа он имеет дело (тебе же нужен не абстрактный Object, как результат функции, а конкретный класс). |
|
|||||
|
Регистрация: Jun 2006
Сообщений: 15
|
спасибо!
|
|
|||||
|
Регистрация: 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 (преобразование вниз, в моей терминологии) - ничего не выйдет. Возможно, я что-то недопонимаю... если так, то объясни, пожалуйста. |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Цитата:
Преобразования из супер-класса в наследника нет, есть только проверка соответствия объекта какому-либо классу. Конструкция AnyClass(anyObject) лишь даёт понять компилятору, с объектом какого типа он имеет дело. Такая конструкция не преобразовывает объект, а лишь проверяет, является-ли anyObject объектом типа AnyClass. Если нет, то вернёт null. Если да -- вернёт тип AnyClass и тогда компилятор может использовать в этом объекте все свойства AnyClass. |
|
|||||
|
Регистрация: Dec 2003
Адрес: Москва
Сообщений: 176
|
С тем, что преобразование, как таковое не идет, я согласен. Это кто как говорит (смысл один): приведение, кастинг, преобразование (согласен, не самое лучшее
). С тем что любой класс is Class я погорячился, а точнее, запутался... Потому что по-дурацки сделано в as. Логичней было бы, писать не так: var ClassRef : Class = Class( getDefinitionByName(name) ); var instance : Object = new ClassRef(); А по поводу того, что getDefinitionByName может возвратить что-нибудь отличное от Class мне все равно не понятно. Т.к. он по-любому (должен) возвращает объект Class, который содержит все необходимые вещи для создания объекта того класса, который мы указали в аргументе name. Последний раз редактировалось fishbounce; 22.06.2006 в 14:55. |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Функция getDefinitionByName возвращает тип Object, т.к. не знает, какого типа возвращаемый ею объект, что и понятно. А тебе нужно получить объект заданного типа и я не вижу ничего такого дурацкого в том, что ты просто объясняешь компилятору, объект какого типа возвращает функция. И если имя класса, переданное в аргументе функции верное (т.е. такой класс существует), то проверка AnyClass(getDefinituonByName(name)); вернёт заданный тип, а не null. Впрочем, я это уже говорил выше.
Что касается логики написания ClassRef.newInstance(); вместо new ClassRef();, то я не вижу логики. Можно написать что-то вроде и писать AnyClassRef.newInstance();, только смысла в этом никакого не вижу. |
|
|||||
|
Flash Aксакал
Регистрация: Jun 2005
Сообщений: 636
|
var c:Object = new ClassFactory ('mx.controls.Button').newInstance ()
|
|
|||||
|
Flash Aксакал
Регистрация: Jun 2005
Сообщений: 636
|
это было адресованно tyombria
|
![]() |
![]() |
Часовой пояс GMT +4, время: 22:07. |
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | |
| Опции просмотра | |
|
|