2009-08-11 1 views
1

Что-то вроде этого вообще имеет смысл в Java?Можно ли расширить общий параметр класса в Java?

class A<T extends B> extends T{ 
    int fun1() { 
    .... 
    }  
} 

abstract class B extends X implements C { 

} 

interface C { 
    int fun1(); 
} 

Я хочу, чтобы класс B идеально расширял как X, так и C. Но так как на Java нет множественного наследования, я пытаюсь придумать обходное решение.

Фокус в том, что материал, который будет определен в C, определяется в Super Class «A». Проблема в том, чтобы получить A, позвольте мне использовать общий тип после «extends»

Мысли?

+2

Не могли бы вы описать больше о реальной проблеме, которая у вас есть. Я никогда не приходил в ситуацию, когда мне действительно требовалось многократное наследование. Это может быть проблема дизайна, которая может быть решена по-разному. Ваше решение кажется довольно сложным. – Juri

+0

Я бы также добавил, что этот тип «шаблонов» классов не работает в java, как в C++. – Chii

ответ

1

Как уже сообщалось, дженерики не помогут вам с множественным наследованием реализаций.

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

Самый простой пример будет выглядеть так:

class A 
{ 
} 

class B extends A 
{ 
} 

interface C 
{ 
    void foo(); 
} 

class CBase extends A implements C 
{ 
    public void foo() 
    { 
     sFoo(this); 
    } 

    static void sFoo(C c) 
    { 
     // Implement foo here 
    } 
} 

class D extends B implements C 
{ 
    public void foo() 
    { 
     CBase.sFoo(this); 
    } 
} 

Обратите внимание, что, чтобы сделать это полезно было бы больше операций, наследуемые D из B и A, которые не показаны в этом примере.

4

Нет, вы не можете сделать типа расширить класс, указанный в качестве параметра типа

Не зная, что A, B, C или X являются, это очень трудно рекомендовать альтернативный дизайн шаблона, я боюсь ,

2

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

Вы можете объявить несколько интерфейсов и использовать агрегацию для «подделки» множественного наследования.

0

Параметр type является только заполнителем для генерических данных общего времени, это фактический тип.

Попытка разработать обходное решение для множественного наследования на языке, который его не поддерживает, вероятно, является хорошим показателем того, что недостаток в дизайне. Высказывание A<T extends B> extends T, очевидно, потерпит неудачу, поскольку оно даже не означает, что вы надеетесь на это означает: <T extends B> означает только то, что T относится к типу являетсяB. Добавление extends T ничего не значит, потому что T не определен в этом классе. Опять же, это тип времени компиляции - фактический тип T напрямую не доступен во время выполнения.

Вы действительно уверены, что то, что лучше всего достигается посредством множественного наследования, а не композиции? Возможно также, что вы пытаетесь получить A, чтобы сделать слишком много вещей.

Более конкретный пример может позволить другим людям дать больше отзывов о самом дизайне.