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

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

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

Регистрация: Feb 2008
Сообщений: 890
По умолчанию Наследование и статические переменные

Приветствую всех!

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

Старый 20.08.2009, 18:38
udaaff вне форума Посмотреть профиль Отправить личное сообщение для udaaff Найти все сообщения от udaaff
  № 2  
Ответить с цитированием
udaaff
...

модератор форума
Регистрация: Sep 2006
Адрес: Minsk
Сообщений: 4,286
Зачем ее статической делать?

Старый 20.08.2009, 18:42
orcpochta вне форума Посмотреть профиль Отправить личное сообщение для orcpochta Найти все сообщения от orcpochta
  № 3  
Ответить с цитированием
orcpochta

Регистрация: Feb 2008
Сообщений: 890
Цитата:
Сообщение от udaaff Посмотреть сообщение
Зачем ее статической делать?
я же объяснил, чтобы изменив ее один раз в классе все экземпляры пользовались новой версией, а так пришлось бы в каждом экземпляре ее менять
__________________
скриптограф

Старый 21.08.2009, 01:23
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 4  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
В NewCar написать
Код AS1/AS2:
public static var speed:Number = Car.speed;
__________________
(и)Нильс.ru | Плагины для FlashDevelop

Старый 21.08.2009, 07:43
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 5  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
У каждого Car может быть своя speed. Но Вам виднее.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 21.08.2009, 11:22
orcpochta вне форума Посмотреть профиль Отправить личное сообщение для orcpochta Найти все сообщения от orcpochta
  № 6  
Ответить с цитированием
orcpochta

Регистрация: Feb 2008
Сообщений: 890
Цитата:
Сообщение от iNils Посмотреть сообщение
В 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, задаваемая в собственном классе. Ну, а статической она является для того, чтобы изменив ее на уровне класса, вся группа получила новое значение (не во всех классах, а только в этом), иначе пришлось бы в каждом экземпляре менять скорость вручную.
__________________
скриптограф

Старый 21.08.2009, 15:39
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 7  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Код AS1/AS2:
class NewCar extends Car {
 
	public static var speed:Number = 50;
 
	public function NewCar () {
		super();
	}
	public function getSpeed():Number
	{
		return speed;
	}
}
__________________
Reality.getBounds(this);

Старый 21.08.2009, 15:50
orcpochta вне форума Посмотреть профиль Отправить личное сообщение для orcpochta Найти все сообщения от orcpochta
  № 8  
Ответить с цитированием
orcpochta

Регистрация: Feb 2008
Сообщений: 890
Это банальное переопределение ф-ии. Представьте, что таких ф-ий 25...))) Получится, что наследник по объему кода равен суперклассу - пропадают все преимущества наследования.
__________________
скриптограф

Старый 21.08.2009, 15:53
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 9  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
А ты в Car во всех методах измени speed на getSpeed(), и наслаждайся всеми преимуществами наследования в любом количестве классов-наследников.
__________________
Reality.getBounds(this);

Старый 21.08.2009, 15:55
Жень Шень вне форума Посмотреть профиль Отправить личное сообщение для Жень Шень Найти все сообщения от Жень Шень
  № 10  
Ответить с цитированием
Жень Шень
 
Аватар для Жень Шень

блогер
Регистрация: Feb 2004
Адрес: Украина
Сообщений: 1,180
Записей в блоге: 3
Отправить сообщение для Жень Шень с помощью ICQ
И даже так работает как просили:
Код 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:12.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

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

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


 


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


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