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

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

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

Регистрация: Oct 2006
Адрес: Novosibirsk-Kaliningrad
Сообщений: 1,278
Отправить сообщение для terbooter с помощью ICQ Отправить сообщение для terbooter с помощью Skype™
По умолчанию Полиморфизм на АС3

Код:
package {
    public class Tbase 
    {
        public function doIt()
        {
            trace("BaseClass Forever!");
        }
    }

    public class TMyClass extends Tbase 
    {
        public override function  doIt()
        {
            trace("But MyClass is more specific");
        }
    }
}
Хочу чтобы была возможность вызвать оба метода. Как?
Делаю так, не выходит

Код:
var Obj:Tbase = new TMyClass();
Obj.doIt();
(Obj as Tbase).doIt();

var MyObj:TMyClass = new TMyClass();
MyObj.doIt();
(MyObj as Tbase).doIt();
Tbase(MyObj).doIt();

var ObjBase: Tbase =new Tbase();
ObjBase.doIt();
//(ObjBase as TMyClass).doIt(); 
//TMyClass(ObjBase).doIt();  // Не может конвертировать

Старый 23.11.2007, 10:13
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 2  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Если метод переопределен, то вызвать метод супер-класса извне невозможно.
Перегрузки методов в AS3 нет. Переопределенный метод — уже полиморфизм.

Старый 23.11.2007, 10:48
terbooter вне форума Посмотреть профиль Отправить личное сообщение для terbooter Найти все сообщения от terbooter
  № 3  
Ответить с цитированием
terbooter

Регистрация: Oct 2006
Адрес: Novosibirsk-Kaliningrad
Сообщений: 1,278
Отправить сообщение для terbooter с помощью ICQ Отправить сообщение для terbooter с помощью Skype™
Хм, значит такое вот определение полиморфизма не правильное
Цитата:
Cловарь по естественным наукам. Глоссарий.ру
<Полиморфизм>.
Полиморфизм - в объектно-ориентированном программировании - способность объекта выбирать правильный метод в зависимости от типа данных, полученных в сообщении.
Объектно-ориентированное программирование

Материалы предоставлены проектом Глоссарий.ru

Старый 23.11.2007, 11:51
fishbounce вне форума Посмотреть профиль Отправить личное сообщение для fishbounce Посетить домашнюю страницу fishbounce Найти все сообщения от fishbounce
  № 4  
Ответить с цитированием
fishbounce

Регистрация: Dec 2003
Адрес: Москва
Сообщений: 176
ээ.. ну почему же неправильное?

строчка "в зависимости от типа данных, полученных в сообщении" очень абстрактна как-то.
В данном случае можно трактовать так, что Obj был создан как TMyClass, т.е. таким образом получил тип данных TMyClass посредством некоего магического сообщения А строчка
Код:
(Obj as TBase)
лишь приводит тип, а не делает Obj инстансом класса TBase. И как раз фишка в том, что можно написать для нескольких наследников TBase
Код:
(someObj as TBase).doIt();
и вызовется именно тот "правильный" метод, который был переопределен в наследнике.


а в этом месте:
Код:
var ObjBase: Tbase =new Tbase();
ObjBase.doIt();
//(ObjBase as TMyClass).doIt(); 
//TMyClass(ObjBase).doIt();  // Не может конвертировать
естественно не будет работать, т.к. преобразование вниз (или вверх, короче к наследнику) не работает никогда. И это логично.


Последний раз редактировалось fishbounce; 23.11.2007 в 11:53.
Старый 26.11.2007, 10:04
terbooter вне форума Посмотреть профиль Отправить личное сообщение для terbooter Найти все сообщения от terbooter
  № 5  
Ответить с цитированием
terbooter

Регистрация: Oct 2006
Адрес: Novosibirsk-Kaliningrad
Сообщений: 1,278
Отправить сообщение для terbooter с помощью ICQ Отправить сообщение для terbooter с помощью Skype™
Цитата:
Сообщение от __etc
Если метод переопределен, то вызвать метод супер-класса извне невозможно.
Перегрузки методов в AS3 нет. Переопределенный метод — уже полиморфизм.
Вроде есть способ:
Код:
var Obj_base:Tbase = new Tbase();
var Obj_my:TMyClass = new TMyClass();
Obj_base.doIt();
Obj_my.doIt();
function doSomething(o:Tbase)
{
    o.doIt();
}
doSomething(Obj_base);
doSomething(Obj_my);
Теперь порядок! Теперь понятно что такое полиморфизм!

Старый 26.11.2007, 10:36
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 6  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Цитата:
Сообщение от terbooter
Вроде есть способ:
Способ чего? Это не перегрузка методов.
А полиморфизм — да, верно. Только тут явно нужен интерфейс.

И ещё, в ActionScript, равно как и в Java, не принято использование Delphi-вских заморочек с имена классов, начинающихся на «T».

Старый 26.11.2007, 10:48
terbooter вне форума Посмотреть профиль Отправить личное сообщение для terbooter Найти все сообщения от terbooter
  № 7  
Ответить с цитированием
terbooter

Регистрация: Oct 2006
Адрес: Novosibirsk-Kaliningrad
Сообщений: 1,278
Отправить сообщение для terbooter с помощью ICQ Отправить сообщение для terbooter с помощью Skype™
Цитата:
Сообщение от __etc
Способ чего?
Способ обратиться к методу суперкласса. Из предыдущих постов я сделал вывод что нельзя:
Цитата:
Сообщение от __etc
Если метод переопределен, то вызвать метод супер-класса извне невозможно.

Старый 26.11.2007, 10:52
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 8  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Так и есть, собственно. Нельзя извне вызвать метод супер-класса, если он переопределен в наследнике.
То, что в качестве типа в функции указан базовый класс, вовсе не означает, что у переданного объекта будет вызван метод его супер-класса, а не собственный переопределенный.

Старый 26.11.2007, 12:34
terbooter вне форума Посмотреть профиль Отправить личное сообщение для terbooter Найти все сообщения от terbooter
  № 9  
Ответить с цитированием
terbooter

Регистрация: Oct 2006
Адрес: Novosibirsk-Kaliningrad
Сообщений: 1,278
Отправить сообщение для terbooter с помощью ICQ Отправить сообщение для terbooter с помощью Skype™
Цитата:
Сообщение от __etc
Так и есть, собственно. Нельзя извне вызвать метод супер-класса, если он переопределен в наследнике.
То, что в качестве типа в функции указан базовый класс, вовсе не означает, что у переданного объекта будет вызван метод его супер-класса, а не собственный переопределенный.
Действительно, так и есть. Разобрался.

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

Регистрация: Jun 2010
Сообщений: 120
Добрый день. Не могли бы разъяснить на пальцах, что такое полиморфизм. Читал и Википедии, и у Мука и на данном сайте, но, честно говоря, не понял.

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

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

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


 


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


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