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

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

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

Регистрация: Jan 2007
Адрес: Минск
Сообщений: 781
Отправить сообщение для джонатан с помощью Skype™
Question Как реализовать "Множественное наследование"

Ребят, здравствуйте! Прдаскажите пожалуйста, стоит задача, сделать так что бы класс C насоедовался от классова A и B, при том, что A и B не наследуются друг от друга, а множественного наследования в ActionScript 3.0 нет.

Вопрос мне задали на собеседовании, ответить я на него не смог, но стало очень любопытно в плане развития, т.к. с подобной нуждой сталкивался неоднократно. Человек который задавал мне этот вопрос, дал наводящую мысль, что для этого есть какой-то паттерн.

Буду признателен если поделитесь информацией. Спасибо.
__________________
Убейте меня!

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

Регистрация: Jan 2006
Адрес: Москва (Нижний Новгород)
Сообщений: 229
Записей в блоге: 1
Отправить сообщение для KBAC с помощью Skype™
Скорее всего вопрос был сформулирован иначе. И речь шла либо об интерфейсах, либо о композиции.
__________________
Будь проще.

Старый 06.02.2015, 14:16
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 3  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Начнем с того, что вопрос задан некорректно =)

Если нельзя наследоваться от A и B одновременно, то таки нельзя. Никак.

Если нужно, чтобы было можно использовать объект класса C там, где обычно используется класс A и/или там, где используется класс B, то можно сделать 2 интерфейса, IA и IB и в классе C унаследоваться от этих 2 интрефейсов.

Пример:
Код AS3:
// описание признаков
public interface IA {
    fucntion doA():void;
}
 
// описание признаков
public interface IB {
    function doB():void;
}
 
// реализация признаков
public class A implements IA
{
    public function doA():void {
        trace('doA called on A!');
    }
}
 
// реализация признаков
public class B implements IB
{
    public function doB():void {
        trace('doB called on B!');
    }
}
 
// класс C наследует 2 интерфейса
// то есть обладает признаками, описанными в IA и в IB одновременно
// однако реализация методов doA() и doB() в классе С отличается от классов A и B
// и это нормально
public class C implements IA, IB {
    public function doA():void {
        trace('doA called on C!');
    }
 
    public function doB():void {
        trace('doB called on C!');
    }
}
 
...
 
public function useA(a:IA):void
{
    a.doA();
}
 
public function useB(b:IB):void
{
    b.doB();
}
 
...
 
// использование C там, где ожидается IA и/или IB
useA(new C()); // работает, так как C наследует интерфейс IA
useB(new C()); // работает, так как C наследует интерфейс IB
Если нужно чтобы поведение класса C было таким же, как у класса A и одновременно таким же, как у класса B, то нужно использовать композицию (возможно, это тот паттерн, о котором хотели услышать в ответ на вопрос).

Пример:
Код AS3:
// класс C использует реализацию методов doA() и doB() из классов A и B
// то есть его поведение совпадает с каждым из них
public class C
{
    public var _a:A;
    public var _b:B;
 
    public function C() {
        _a = new A();
        _b = new B();
    }
 
    public function doA():void {
        _a.doA();
    }
 
    public function doB():void {
        _b.doB();
    }
}
 
...
 
useA(new C()); // ошибка компиляции, потому что C не является IA, который ожидает функция
useB(new C()); // ошибка компиляции по той же причине
Если же нужно и поведение сохранить, и иметь возможность использовать C там, где ожидается IA или IB, то нужно использовать и интерфейсы, и композицию.
__________________
...вселенская грусть

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

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

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


 


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


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