2015-05-21 2 views
1

Time-соответствующий привет :)Java: Реализация стыковку с помощью наследования класс

Работа в Java, у меня есть интерфейс A. Все реализаторы этого интерфейса также расширить класс B, но B не реализует А. В класс, в котором мы используем экземпляр A (обозначается как A), он передается в B Reference, так что мы можем использовать метод, определенный в классе B. Идеально имеет смысл, что метод должен также принадлежать интерфейсу A.

Можете ли вы придумать причину, по которой не следует вводить метод интерфейса A, так что нам не нужно бросать его в B? Должен ли я переопределить метод в подклассах и просто вызвать супер-версию, чтобы было легче ориентироваться в среде IDE и т. Д.?

+7

Почему B не реализует? –

+0

Я не знаю, что такое классы на самом деле, но кажется, что это можно решить, перепроектировав всю систему. – Bubletan

+0

Отбросьте интерфейс A и используйте только класс B. –

ответ

4

В классе, где мы используем экземпляр A (ссылка, как A), он приводится к B Reference, так что мы можем использовать метод, определенный в классе B.

Так что я м при условии, что у вас есть этот сценарий

public void doStuff(A aType){ 
    ... 
    B bType = (B) aType; 
    ... 
} 

Если это правда, может это работать?

private <T extends B & A> void example(T type){ 
    type.aStuff(); 
    type.doBStuff(); 
} 

Я создал следующее, чтобы проверить это.

public class Foo{ 
    private static interface A{ 
    void aStuff(); 
    } 

    private static class B{ 
    public void doBStuff(){ 
     System.out.println("B stuff"); 
    } 
    } 

    private static class AB extends B implements A{ 
    public void aStuff(){ 
     System.out.println("A stuff"); 
    } 
    } 

    public static void main(String[] args) { 
    Foo foo = new Foo(); 
    foo.example(new AB()); 
    } 

    // method "example" already given 
} 

Дал мне

A stuff 
B stuff
+0

Это может сработать. Я не знал, что ты можешь это сделать. Но, возможно, нам нужно немного перепроектировать, потому что это сложнее, чем нужно. До сих пор я только что повторил метод в интерфейсе. Возможно, у меня будет второй взгляд и посмотрим, есть ли какая-либо реальная ценность в его использовании как в A, так и B. Я действительно переопределяю метод в подклассе только для вызова супер, потому что, если вы ищете в Eclipse для использования метода в A, вы не увидит экземпляры, где он вызывается с помощью ссылки B. Это очень плохо. –

0

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

Я думаю, что теперь методы перемещения не будут хорошей идеей, возможно, в лучшем случае имеют B-реализацию A (если у вас нет других классов, о которых вы не говорили, которые зависят от классов и интерфейсов, которые вы упомянули).

+0

A слишком большой и слишком разный для B для его реализации, но спасибо. Я должен был объяснить больше в примере ... –

Смежные вопросы