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

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

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

Регистрация: Dec 2011
Сообщений: 40
Post наследование, одна переменная у родителя - у детей эта переменная разная

Сделал базовый класс Button, который содержит определенный набор свойств и методов

Код AS3:
class Button extends Sprite{
 
        public var pict:Sprite=new Sprite();	
 
        public function Button ()
        {
		    addChild(pict);
	}
 
        public function SetX ():void
        {
		    pict.x= 200;
	}
 
}

И два класса, которые будут наследовать методы и свойства от этого класса, вот только переменная pict должна стать другой.



Код AS3:
class Button1 extends Button{
 
        public var pict:black=new black();	//black - класс картинки из библиотеки
 
        public function Button1 ()
        {
		   this.x=100;
		   this.y=50;
	}
 
}

Код AS3:
class Button2 extends Button{
 
        public var pict:green=new green();	//green - класс картинки из библиотеки
 
        public function Button2 ()
        {
		   this.x=100;
		   this.y=50;
	}
 
}
Что я делаю не так?

Старый 21.03.2012, 22:53
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 2  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Перенесите создание экземпляров картинок в конструкторы.
__________________
тут я

Старый 21.03.2012, 23:09
Nikolay00700 вне форума Посмотреть профиль Отправить личное сообщение для Nikolay00700 Найти все сообщения от Nikolay00700
  № 3  
Ответить с цитированием
Nikolay00700

Регистрация: Dec 2011
Сообщений: 40
переписал таким образом.
Проблема в том, что он работает только с теми экземплярами, которые создал в конструкторе базового класса. А мне нужно, чтобы всё то, что проделывается в конструкторе базового класса, проходило с переменными созданными в детях.

Код AS3:
class Button extends Sprite{
 
        public var pict:Sprite;	
 
        public function Button ()
        {
               pict=new Sprite();			    
               addChild(pict);
	}
 
        public function SetX ():void
        {
		    pict.x= 200;
	}
 
}

Код AS3:
class Button1 extends Button{
 
 
 
        public function Button1 ()
        {
                   pict=new black();	//black - класс картинки из библиотеки		   
                   this.x=100;
		   this.y=50;
	}
 
}
Код AS3:
class Button2 extends Button{
 
 
        public function Button2 ()
        {
		   pict=new green();	//green - класс картинки из библиотеки
                   this.x=100;
		   this.y=50;
	}
 
}
Я вижу один выход. Например содержимое класса родителя вынести в отдельную функцию, за минусом создания экземпляров.
И в конструкторе детей вызывать эту функцию...

Но что-то мне это не нравится... Мне кажется должно быть иначе...


Последний раз редактировалось Nikolay00700; 21.03.2012 в 23:12.
Старый 21.03.2012, 23:15
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 4  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Да, вынесите в init(), в наследниках переопределяйте этот метод. Это нормально.
Только не обязательно вызывать в каждом ребенке этот метод. Достаточно только в super (базовом).
__________________
тут я

Старый 21.03.2012, 23:18
Inet_PC вне форума Посмотреть профиль Отправить личное сообщение для Inet_PC Посетить домашнюю страницу Inet_PC Найти все сообщения от Inet_PC
  № 5  
Ответить с цитированием
Inet_PC
 
Аватар для Inet_PC

Регистрация: Feb 2009
Адрес: Гы...поди, найди!
Сообщений: 853
Записей в блоге: 1
Можно в конструктор параметром передать:
Код AS3:
public function Button (value: Sprite=null)
{
	pict=value || new Sprite();			    
	addChild(pict);
}
Можно так:
Код AS3:
public function Button ()
{
	pict||=new Sprite();			    
	addChild(pict);
}
Но лучше слушайте, что Вам говорит КорДум!
__________________
http://www.chessmax.ru

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

Регистрация: Dec 2011
Сообщений: 40
Но работает правильно только тогда, когда вызываю эту функцию в конструкторе у каждого ребенка. Если вызываю эту функцию в конструкторе базового класса, то он опять работает только с экземплярами созданными в конструкторе базового класса...

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

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Наверняка вы не переопределяете метод.
Сейчас набросаю пример на коленке. Одну минуту.

Добавлено через 2 минуты
Код AS3:
class ButtonBase() {
    public function ButtonBase() {
        init();
    }
 
    protected function init():void {
        // какой-то код
    }
}
Код AS3:
class Button extends ButtonBase() {
    public function ButtonBase() {
        super();
    }
 
    override protected function init():void {
        // какой-то ДРУГОЙ код
    }
}
Код AS3:
new Button();
В результате чего init() вызовется как бы в классе родителя, но это будет ПЕРЕОПРЕДЕЛЕННЫЙ метод.
__________________
тут я


Последний раз редактировалось КорДум; 21.03.2012 в 23:27.
Старый 21.03.2012, 23:26
Nikolay00700 вне форума Посмотреть профиль Отправить личное сообщение для Nikolay00700 Найти все сообщения от Nikolay00700
  № 8  
Ответить с цитированием
Nikolay00700

Регистрация: Dec 2011
Сообщений: 40
Inet_PC -
такая же ситуация... работает с экземплярами которые создаются в базовом классе... т.к. конструктор базового класса запускается раньше...

Добавлено через 6 минут
Тогда получается, что создание экземпляра pict мне в init писать?

Старый 21.03.2012, 23:37
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 9  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Верно.
__________________
тут я

Старый 21.03.2012, 23:39
Nikolay00700 вне форума Посмотреть профиль Отправить личное сообщение для Nikolay00700 Найти все сообщения от Nikolay00700
  № 10  
Ответить с цитированием
Nikolay00700

Регистрация: Dec 2011
Сообщений: 40
И не работает. Я сделал изменения в эту сторону.

Error: Access specifiers are not allowed with namespace attributes.
Error: Incompatible override.
Error: Overriding a function that is not marked for override.
Я наверное что-то не так делаю...

Создать новую тему Ответ Часовой пояс GMT +4, время: 18:22.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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