My First ActionScript 3 Application » public dynamic class Object
Главная > Мысли вслух > public dynamic class Object

public dynamic class Object

Товарищ!!!

Помни, что несмотря на то, что "Класс Object находится в корне иерархии классов ActionScript. /см.здесь/", конструкция


package {
	import flash.display.Bitmap;

	public class Item {
		public var label:String;
		public var image : Bitmap;
		public function Item(label:String, image:Bitmap):void {
			label = label;
			image = image;
		}
	}
}

не является объявлением экземпляра класса Object и за использование такого подхода к программированию нужно отправлять на общественные работы...

Читайте хотя бы все тот же мануал, и используйте язык как все цивилизованные люди:


package {
	import flash.display.BitmapData;
	import flash.display.Bitmap;

	public class Item {
		public function Item():void {

			var item:Object = {label:String, image:Bitmap, data:Object};

			item.label = "Jhon Smith";
			item.image = new Bitmap(new BitmapData(50,50));
			item.data = {a:10, b:"something", c:true};
		}
	}
}

ну... вот как то так... 🙂

UPD: Кстати, а как нужно изменить класс из первого примера, чтобы он таки стал Объектом? 😉

Categories: Мысли вслух Tags: ,
  1. Mike
    6 марта 2009 в 10:59 | #1

    В первом примере вижу ошибку другого рода. Надо так:
    this.label = label;
    this.image = image;

    Item, кстати, по-любому является объектом. Видимо, вопрос в том делать его dynamic или нет?

  2. prof
    6 марта 2009 в 13:48 | #2

    Ничего не понял.
    Первый вариант действительно не является объявлением экземпляра класса Object. Во-первых, это вообще не объявление экземпляра класса, а объявление самого класса. Во-вторых, объявление класса Object может начинаться только с «public class Object», а у нас написано «public class Item». Поэтому мы имеем объявление класса Item. Но этот класс наследуется от Object (неявно, но наследуется).
    Второй вариант — тоже объявление класса Item, но в отличие от первого варианта у этого класса нет никаких свойств (у первого есть два публичных свойства). И конструктор в первом случае принимает два параметра, а во втором — ничего не принимает. В остальном эти два класса идентичны.

  3. 6 марта 2009 в 14:00 | #3

    @Mike

    да, именно так 🙂

  4. 6 марта 2009 в 14:08 | #4

    prof :

    Второй вариант — тоже объявление класса Item, но в отличие от первого варианта у этого класса нет никаких свойств (у первого есть два публичных свойства). И конструктор в первом случае принимает два параметра, а во втором — ничего не принимает. В остальном эти два класса идентичны.

    Я наверное Вас запутал 🙂

    Смысл был в том, как лучше пользоваться Object-ом. Например нужно в список добавить несколько позиций, каждый элемент которой — Object. Можно создать для каждого элемента экземпляр заранее заготовленного класса (например вышеозначенный Item), а можно прямо в методе использовать конструкцию как во втором примере. Второй вариант работает намного быстрее… или нет?

  5. prof
    6 марта 2009 в 14:57 | #5

    @Михаил Есютин

    Да, именно запутали. Причем, попытка пояснить смысл не принесла ощутимых результатов 🙂
    Попробую описать, что именно я понял:
    — есть список позиций;
    — каждая позиция состоит из элементов типа Object.

    Предлагается, насколько я понял, использовать один из вариантов:
    — создавать для элементов позиции отдельный класс Item;
    — использовать для элементов позиции класс Object.

    Если я все понял правильно, то мысли такие:
    — с точки зрения быстродействия обращение к свойствам и методам динамического класса более затратно, чем обращение к свойствам и методам статического класса;
    — использование отдельного класса Item (не важно, динамического или статического) позволит выполнять при необходимости дополнительную проверку типов (if (!item is Item) trace(‘AHTUNG!!!’));
    — использование статического класса позволит использовать автокомплит;
    — класс Item — дополнительная сущность (сложность повышается, хоть и не сильно), требует времени (хоть и не большого) для его объявления;
    — (длинный список плюсов и минусов статической и динамической типизации).

    В итоге, я за статическую типизацию, но иногда использую динамические классы. Основанием для принятия решения о том, как нужно делать в каждом конкретном случае, является внутренний голос 🙂

    Или я все неправильно понял?

  6. 6 марта 2009 в 19:41 | #6

    prof :
    Или я все неправильно понял?

    Ответ в следующей публикации.

  7. 16 марта 2009 в 02:25 | #7

    Коменты не читал, но пост содержит концептуальные смысловые ошибки.

    Во-первых Вы возможно путаете смысл слов класс, объект, экземпляр класса и class Object. В Вашем случае в начале идет всего лишь объявление класса Item, который по умолчанию является наследником класса Object, то есть там ровным счетом написано public class Item extends Object. Конструкция {…} есть просто укороченное от a = new Object();a.b=..;a.c=; что можно делать потому что Object динамический класс и эта загогулина создает экземпляр класса Object.

    Далее, если мы работаем с некоторым набором объектов с одинаковыми свойствами, пусть даже ни одного метода они не имеют, создавать специальный класс Item с двумя свойствами есть очень правильно, и отправлять на общественные работы надо тех, кто в этом случае передает данные в динамических объектах. Во-первых удобно разбирать чужой код, во-вторых такая конструкция постепенно обрастет геттерами и сеттерами с полезными проверками.

    Есть два логичных места, где простые объекты целесообразны в употреблении: у нас не понятное количество свойств у объектов некоторого множества; небольшой однокадровый (одноклассовый) код.

  8. 16 марта 2009 в 09:00 | #8

    Valentin Vladimirovich :
    …если мы работаем с некоторым набором объектов с одинаковыми свойствами, пусть даже ни одного метода они не имеют, создавать специальный класс Item с двумя свойствами есть очень правильно, и отправлять на общественные работы надо тех, кто в этом случае передает данные в динамических объектах.

    Во-первых удобно разбирать чужой код, во-вторых такая конструкция постепенно обрастет геттерами и сеттерами с полезными проверками.

    Есть два логичных места, где простые объекты целесообразны в употреблении: у нас не понятное количество свойств у объектов некоторого множества; небольшой однокадровый (одноклассовый) код.

    Согласен с логикой Ваших аргументов. Просто речь шла как раз о том, что НЕ НУЖНО вместо каждого использования Object создавать отдельный класс…

  9. FlasherEdik
    21 октября 2011 в 11:05 | #9

    package {
        import flash.display.Bitmap;
     
        public dynamic class Item extends Object{
    	public var label:String;
    	public var image : Bitmap;
    	public function Item(label:String, image:Bitmap):void {
    		label = label;
    		image = image;
    	}
        }
    }
    

  1. 6 марта 2009 в 19:39 | #1