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

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

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

Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
По умолчанию Как вызвать непереопределенный метод в базовом классе

В соседней ветке речь зашла про super, и там меня похоже не совсем правильно поняли.
Поэтому, чтобы не усложнять пример 2мя классами, рассмотрю вариант только с одним, базовым.

Есть класс, есть в нем объявленный метод methodA, который может быть переопределен наследником. Как мне в базовом классе вызвать без обходных путей непереопределенный метод methodA? Вызываю super.methodA(), а в трэйс вываливается ран-тайм ошибка. Может я в чем то ошибся? Или это так и задумано?

код вызова:
Код AS3:
var _a:ClassA = new ClassA();
 
 
trace( "_a.methodA(): " + _a.methodA() );
trace( "_a.methodA_super(): " + _a.methodA_super() );
ClassA:
Код AS3:
package
{
	public class ClassA
	{
		public function ClassA()
		{
		}
 
 
		public function methodA():String
		{
			return "ClassA::methodA()";
		}
 
		public function methodA_super():String
		{
			return super.methodA();
		}
	}
}
трэйс:
Цитата:
_a.methodA(): ClassA::methodA()
ReferenceError: Error #1070: Method methodA not found on Object
at ClassA/methodA_super()
at test_fla::MainTimeline/frame1()

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

блогер
Регистрация: Sep 2008
Адрес: Менск
Сообщений: 586
Записей в блоге: 1
Отправить сообщение для incvizitor с помощью Skype™
Сейчас попробовать не могу, но может вот так:

Код AS3:
package
{
	public class ClassA
	{
 
                private var _thisA:Function;                
 
		public function ClassA()
		{
                       _thisA=this.methodA;
		}
 
 
		public function methodA():String
		{
			return "ClassA::methodA()";
		}
 
		public function methodA_super():String
		{
			return _thisA();
		}
	}
}
?

Думаю надо в этом направлении думать.

Старый 07.05.2010, 18:44
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 3  
Ответить с цитированием
i.o.
 
Аватар для i.o.

Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
Спасибо. Просто думаю это как раз один из обходных путей. Хочется узнать почему простого super.methodA() недостаточно

Так то и так можно организовать, и тоже все гуд будет:
Код AS3:
package
{
	public class ClassA
	{
		public function ClassA()
		{
		}
 
 
		public function methodA():String
		{
			return _super_methodA();
		}
 
		private function _super_methodA():String
		{
			return "ClassA::methodA()";
		}
 
	        public function methodA_super():String
		{
		//	return super.methodA();
                        return _super_methodA();
		}
	}
}
Но какое то чувство остается, что должно быть проще ))


Последний раз редактировалось i.o.; 07.05.2010 в 18:47.
Старый 07.05.2010, 19:00
cauchy вне форума Посмотреть профиль Отправить личное сообщение для cauchy Найти все сообщения от cauchy
  № 4  
Ответить с цитированием
cauchy
 
Аватар для cauchy

Регистрация: Jan 2009
Адрес: Северный островок дефолт-сити
Сообщений: 144
Цитата:
Сообщение от i.o. Посмотреть сообщение
Вызываю super.methodA(), а в трэйс вываливается ран-тайм ошибка.
Ну правильно, я так понимаю раз класс ничего не расширяет, то по-дефолту он расширяет Object.
Вот он тебе и пишет в эксепшене что у Object нет такого метода.

Вообщем помоему постановка задачи какая то кривая очень, раз нет никакого наследования здесь - к чему тогда вообще super и всё подобное.

Старый 07.05.2010, 19:10
incvizitor вне форума Посмотреть профиль Отправить личное сообщение для incvizitor Найти все сообщения от incvizitor
  № 5  
Ответить с цитированием
incvizitor
 
Аватар для incvizitor

блогер
Регистрация: Sep 2008
Адрес: Менск
Сообщений: 586
Записей в блоге: 1
Отправить сообщение для incvizitor с помощью Skype™
Можно так, но это как то не красиво

Код AS3:
final public function methodA_super():String
{
	if(getQualifiedClassName(this)!="ClassA"){
              if(getQualifiedClassName(super)=="classA")
                    return super["methodA"];
              else
                    return super["methodA_super"];
        }
        else
            return methodA();
}


Последний раз редактировалось incvizitor; 07.05.2010 в 19:43.
Старый 07.05.2010, 19:18
cauchy вне форума Посмотреть профиль Отправить личное сообщение для cauchy Найти все сообщения от cauchy
  № 6  
Ответить с цитированием
cauchy
 
Аватар для cauchy

Регистрация: Jan 2009
Адрес: Северный островок дефолт-сити
Сообщений: 144
Что тут происходит, расскажите мне))
Ну или расскажите, что принять нужно, чтобы это понять?)


Цитата:
Есть класс, есть в нем объявленный метод methodA, который может быть переопределен наследником. Как мне в базовом классе вызвать без обходных путей непереопределенный метод methodA?
this.methodA();

Старый 07.05.2010, 19:25
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 7  
Ответить с цитированием
i.o.
 
Аватар для i.o.

Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
Цитата:
раз нет никакого наследования здесь - к чему тогда вообще super и всё подобное.
Да потому что с наследованием тоже самое. Написал же в самом начале, что упростил до одного класса специально.

Вот с наследованием. Как мне вызвать непереопределленный метод суперкласса из самого же суперкласса?

код:
Код AS3:
var _b:ClassB = new ClassB();
 
 
trace( "_b.methodA(): " + _b.methodA() );
trace( "_b.methodA_simple(): " + _b.methodA_simple() );
trace( "_b.methodA_super(): " + _b.methodA_super() );
ClassA:
Код AS3:
package
{
	public class ClassA
	{
		public function ClassA()
		{
		}
 
 
		public function methodA():String
		{
			return "ClassA::methodA()";
		}
 
		final public function methodA_simple():String
		{
			return this.methodA();
		}
 
		final public function methodA_super():String
		{
			return super.methodA();
		}
	}
}
ClassB:
Код AS3:
package
{
	public class ClassB extends ClassA
	{
		public function ClassB()
		{
			super();
		}
 
 
		override public function methodA():String
		{
			return "ClassB::methodA()";
		}
	}
}
трэйс:
Цитата:
_b.methodA(): ClassB::methodA()
_b.methodA_simple(): ClassB::methodA()
ReferenceError: Error #1070: Method methodA not found on Object
at ClassA/methodA_super()
at test_fla::MainTimeline/frame1()
Вот как мне сделать, чтобы methodA_super() всегда вызвал непереопределенный methodA(), т.е чтобы возвращал "ClassA::methodA()". Я вот хочу в суперклассе ClassA всегда работать с непереопределенным методом methodA(). Как мне это сделать без всяких private function _super_methodA():String
Почему при вызове super.methodA(); лезет в Object, если суперкласс метода - это ClassA?


Последний раз редактировалось i.o.; 07.05.2010 в 19:32.
Старый 07.05.2010, 19:27
incvizitor вне форума Посмотреть профиль Отправить личное сообщение для incvizitor Найти все сообщения от incvizitor
  № 8  
Ответить с цитированием
incvizitor
 
Аватар для incvizitor

блогер
Регистрация: Sep 2008
Адрес: Менск
Сообщений: 586
Записей в блоге: 1
Отправить сообщение для incvizitor с помощью Skype™
cauchy, если у Вас есть объект класса ClassA то при вызове methodA_super (такое же тоже возможно) он вернет methodA. В обратном случае класс будет вызывать свойство methodA_super своего суперкласса, таким образом рекурсивно добираясь до класса который непосредственно расширяет ClassA. Но метод предложенный i.o. намного лучше.


Последний раз редактировалось incvizitor; 07.05.2010 в 19:45.
Старый 07.05.2010, 19:39
i.o. вне форума Посмотреть профиль Отправить личное сообщение для i.o. Найти все сообщения от i.o.
  № 9  
Ответить с цитированием
i.o.
 
Аватар для i.o.

Регистрация: Apr 2010
Адрес: Earth
Сообщений: 1,897
incvizitor, похоже вы перепутали getDefinitionByName() с getQualifiedClassName().
В общем подставил, ничего не изменилось.

Помнится wvxvw любит использовать super. Он наверняка знает ответ )


Последний раз редактировалось i.o.; 07.05.2010 в 19:44.
Старый 07.05.2010, 19:44
incvizitor вне форума Посмотреть профиль Отправить личное сообщение для incvizitor Найти все сообщения от incvizitor
  № 10  
Ответить с цитированием
incvizitor
 
Аватар для incvizitor

блогер
Регистрация: Sep 2008
Адрес: Менск
Сообщений: 586
Записей в блоге: 1
Отправить сообщение для incvizitor с помощью Skype™
Да, перепутал Ну не знаю, я написал:

Код AS3:
super.methodA();
выдало ошибку при компиляции.

Код AS3:
super["methodA"]
Ошибку при компиляции не выдало.

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

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

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


 


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


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