Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Наследование и статические переменные (http://www.flasher.ru/forum/showthread.php?t=128932)

orcpochta 20.08.2009 18:14

Наследование и статические переменные
 
Приветствую всех!

Пусть есть класс Car, у которого есть статическая переменная speed, которая используется во множестве функций множества экземпляров этого класса (множества здесь в смысле, что их много). Если мы меняем значение этой статической переменной speed, то, естественно, все экземпляры класса Car в своих функциях используют новое значение этой переменной.
Предположим, что я хочу создать класс NewCar, наследующий класс Car. У класса NewCar другое значение статической переменной speed. Как мне не переопределяя все функции (использующие speed) из Car в NewCar добиться, чтобы эти функции использовали значение статической переменной speed из подкласса, а не из класса?

udaaff 20.08.2009 18:38

Зачем ее статической делать?

orcpochta 20.08.2009 18:42

Цитата:

Сообщение от udaaff (Сообщение 844233)
Зачем ее статической делать?

я же объяснил, чтобы изменив ее один раз в классе все экземпляры пользовались новой версией, а так пришлось бы в каждом экземпляре ее менять

iNils 21.08.2009 01:23

В NewCar написать
Код AS1/AS2:

public static var speed:Number = Car.speed;


dimarik 21.08.2009 07:43

У каждого Car может быть своя speed. Но Вам виднее.

orcpochta 21.08.2009 11:22

Цитата:

Сообщение от iNils (Сообщение 844338)
В NewCar написать
Код AS1/AS2:

public static var speed:Number = Car.speed;


она и без этого берется из Car, если всефункции, использующие статическую переменную, в наследнике не переопределять.

Попробую еще раз объяснить.

Есть суперкласс Car:
Код:

class Car {
        private static var speed:Number = 10;
       
        public function Car () {
               
        }
       
        public function getSpeed ():Number {
                return speed;
        }

            // + еще 25 функций, использующих speed;
}

Есть расширяющий класс NewCar:
Код:

class NewCar extends Car {
        private static var speed:Number = 50;
       
        public function NewCar () {
                super();
        }
       
            /* тут надо что-то написать, чтобы не переписывать все
функции из Car, использующие speed, т.к. в таком варианте значение
speed берется из Car, а не из NewCar. Ибо, если переписать все
функции, то теряется сам смысл наследования */

}

Код фла-файла:
Код:

var car:Car = new Car();
var newCar:NewCar = new NewCar();

trace(car.getSpeed());
trace(newCar.getSpeed());

Цитата:

Output:
10
10
хочу добиться: 10 и 50.

2dimarik:

Цитата:

У каждого Car может быть своя speed. Но Вам виднее.
Вы сейчас мыслите категориями физической привязки моделей в каком-то приложении.
Постараюсь описать мой случай.
Есть две категории юнитов (два класса: один супер, второй наследник; или два наследника от одного супер - не важно) - "свои" и "враги", соответственно есть две группы юнитов по n штук в каждой. Эти две группы юнитов передвигаются по карте, каждой группе присуща своя скорость speed, задаваемая в собственном классе. Ну, а статической она является для того, чтобы изменив ее на уровне класса, вся группа получила новое значение (не во всех классах, а только в этом), иначе пришлось бы в каждом экземпляре менять скорость вручную.

Wolsh 21.08.2009 15:39

Код AS1/AS2:

class NewCar extends Car {
 
        public static var speed:Number = 50;
 
        public function NewCar () {
                super();
        }
        public function getSpeed():Number
        {
                return speed;
        }
}


orcpochta 21.08.2009 15:50

Это банальное переопределение ф-ии. Представьте, что таких ф-ий 25...))) Получится, что наследник по объему кода равен суперклассу - пропадают все преимущества наследования.

Wolsh 21.08.2009 15:53

А ты в Car во всех методах измени speed на getSpeed(), и наслаждайся всеми преимуществами наследования в любом количестве классов-наследников.

Жень Шень 21.08.2009 15:55

И даже так работает как просили:
Код AS1/AS2:

/////////// NewCar.as /////////////////////
class NewCar {
        private static var speed:Number = 50;
        public function NewCar() {
                super();
                trace(Car.speed)
        }
        public function getSpeed():Number {
                return speed;
        }
        // + еще 25 функций, использующих speed;
}
/////////// Car.as /////////////////////
class Car {
        private static var speed:Number = 10;
        public function Car() {
        }
        public function getSpeed():Number {
                return speed;
        }
}
/////////// car.fla ////////////////////
var car:Car = new Car();
var newCar:NewCar = new NewCar();
trace(car.getSpeed());
trace(newCar.getSpeed());

Но! В таком случае из подкласса нельзя выполнить:
Код AS1/AS2:

public function NewCar() {
                super();
                trace(Car.speed)
        }

Так что правилльней будет как Wolsh прописал.
А прочесть по этой ситуации можно у Мука "Основы АС2" стр. 111

dimarik 21.08.2009 19:56

Цитата:

Сообщение от orcpochta (Сообщение 844383)
2dimarik:

Вы сейчас мыслите категориями физической привязки моделей в каком-то приложении.
Постараюсь описать мой случай.
Есть две категории юнитов (два класса: один супер, второй наследник; или два наследника от одного супер - не важно) - "свои" и "враги", соответственно есть две группы юнитов по n штук в каждой. Эти две группы юнитов передвигаются по карте, каждой группе присуща своя скорость speed, задаваемая в собственном классе. Ну, а статической она является для того, чтобы изменив ее на уровне класса, вся группа получила новое значение (не во всех классах, а только в этом), иначе пришлось бы в каждом экземпляре менять скорость вручную.

Можно сделать ее дефолтной. Кстати, Вы тоже мыслите категориями.

orcpochta 21.08.2009 20:36

Цитата:

Сообщение от Wolsh (Сообщение 844480)
А ты в Car во всех методах измени speed на getSpeed(), и наслаждайся всеми преимуществами наследования в любом количестве классов-наследников.

Спасибо!!! :yahoo:
Во меня заклинило...)) Я Мука дочитал пол года назад, наверное, и точно помнил, что он эту ситуацию описывал, а решение вспомнить никак не мог. Точнее даже вспомнил, но видимо в спешке что-то напортачил, результата нужного не получил и отбросил. Ходил мучился, что Мук в 200 километрах от меня и нельзя его почитать..)))


2Жень Шень:
Не понял вашу мысль. Стоял читал, пока ждал своей очереди на сдачу экзамена на права. Сдал. Сейчас пришел домой, еще несколько раз прочитал - все равно не понял... :umnik2: :wacko: :D
Объясните поподробней вашу мысль, если не сложно, чтобы у меня недопонимания в этом вопросе не оставалось.
На счет Мука... Мук форева! :)


2dimarik

Цитата:

Можно сделать ее дефолтной.
Извините, не понял, что вы имеете ввиду. Можно подробней? :)

Wolsh 21.08.2009 20:53

Цитата:

Спасибо!!!
Мне очень стыдно - я поспешил, писал уходя с работы и не додумал. На самом деле все еще проще.
Надо просто добавить в классы геттер.
Код AS1/AS2:

class Car {
        private static var carspeed:Number = 10;
 
        public function Car () {
 
        }
        public function get speed ():Number {
                return carspeed;
        }
        public function getSpeed ():Number {
                return speed;
        }
}

Код AS1/AS2:

class NewCar extends Car {
        private static var carspeed:Number = 50;
 
        public function NewCar () {
                super();
        }
        public function get speed ():Number {
                return carspeed;
        }
}

И тогда не надо ничего переписывать. Удачи))

orcpochta 21.08.2009 21:16

Кстати, сам Мук предпочитает ваш первый вариант, а геттеры и сеттеры почему-то недолюбливает - насколько я понял из его книги по ас2 :)

Жень Шень 21.08.2009 22:22

Вложений: 1
Цитата:

Сообщение от orcpochta (Сообщение 844632)
2Жень Шень:
Не понял вашу мысль

Лучше один раз увидеть... Смотрим аттач.
Потом дабавьте "trace(Car.speed)"
Да, пропустил расширение Car до NewCar:
Код AS1/AS2:

class NewCar extends Car{

но, это не меняет сути.

orcpochta 21.08.2009 22:50

Я честно не могу понять, что вы хотите мне показать, извините. То, что вы написали раньше, я уже опробовал, посмотрел аттач - там все то же самое...))

Не могу понять, чего я не вижу, а вижу вот что:
класс Car определяет статпеременную speed = 10;
он же определяет функцию getSpeed(), возвращающую эту переменную
класс NewCar определяет свою статпеременную speed=50;
он же переопределяет ф-ию getSpeed() => она возвращает уже 50;
trace(Car.speed) напрямую обращается к статпеременной из Car (она хоть и прайвэт, но т.к. NewCar - подкласс, то имеет к ней доступ и выдает 10).

У вас доступа не было из-за того, что один класс не расширял другого.

Жень Шень 22.08.2009 16:22

Вложений: 1
Цитата:

Сообщение от orcpochta (Сообщение 844662)
Я честно не могу понять, что вы хотите мне показать

Извините, я неправильно понял вопрос, а значит был неправ.
Исходя из теперь правильно понятой задачи, могу предложить следующее:
Функции использующие speed в классе Car должны знать кто их вызывает (экземпляр какого класса-подкласса). Поэтому введя некий признак (например, myName) можно использовать то или иное значение скорости. Конечно, надо переделать все 25 функций основного класса(!).
Последнее слово за вами.

dimarik 23.08.2009 17:03

Выше я указывал на подход к _проектироаванию_. Ну, бл, любой CAr имеет свой спиид. Завтра, Вам, дорогой товарищ, понадобится развести группы по скоростям, отдельно для _каждаго_ "свои", отдельно для _каждаго_ "enemy". Я сплю и вижу тучу танков, но они движутся каждый сам по себе.


А теперь все вместе начинаем думать о "Вы сейчас мыслите категориями физической привязки моделей в каком-то приложении.". Разом! И вообще о "категориях" мышления. Вы Гёте читали?

orcpochta 23.08.2009 18:26

Я указал в начале конкретную задачу, вы вклинились со своей репликой про у каждого может быть своя скорость, я вам ответил, что вы мыслите конкретно под физ. модель, ибо я нигде не давал повод думать, что у каждого может быть своя скорость и, чтобы окончательно развеять ваш порыв, привел конкретный свой пример. У вас проблемы с логикой?

dimarik 23.08.2009 18:44

Вы указали на задачу, не соответствующую нормальной логике. У Вас проблемы с логикой.

Wolsh 23.08.2009 21:09

)) Не пойму, dimarik, а что собственно нелогичного в том что все танки класса Hunter ездят с одной скоростью, а Dictator - с другой?
И почему бы orcpochta самому не задавать правила своей игры?


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

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