Показать сообщение отдельно
Старый 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, то нужно использовать и интерфейсы, и композицию.
__________________
...вселенская грусть