Форум 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


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

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