2014-02-14 2 views
1

У меня есть два разных интерфейса, которые используют одни и те же методы, но не реализуют и не расширяют друг друга. Эти два интерфейса каждый расширяются другим классом, который реализует методы интерфейсов.Изменение переменных класса типа

У меня тогда есть класс, который находится в отдельном пакете, который вызывает методы интерфейса.

Таким образом, класс имеет методы, которые называет методы интерфейсов, которые все одинаковы.

public void doThis(){ 
    connection.doThis(); 
} 

public void doThat(){ 
    connection.doThat(); 
} 

public void doAnother(){ 
    connection.doAnother(); 
} 

Теперь я хочу, чтобы сделать переменную соединение работы для обоих Interface1 и interface2.

Моя идея состояла в том, чтобы установить соединение в качестве класса переменной

Object connection 

, а затем изменить его тип, чтобы interface1 или interface2 в зависимости от состояния:

if(this){ 
//condition which converts connection to type interface1 
} 
else{ 
//condition which converts connection to type interface2 
} 

Как я могу это сделать. Я могу сделать это?

Мне предоставлен интерфейс, который нельзя изменить, но не использует удаленный доступ. Но в моем проекте используется RMI. Поэтому я создал второй интерфейс в отдельном пакете, который выполняет Remote. Таким образом, причина для двух разных интерфейсов, которые делают то же самое.

+0

Почему бы не использовать дженерики? –

+0

Если оба интерфейса имеют одинаковые методы, вам не нужно ничего делать, используйте ссылочный тип как 'Interface1' или' Inteface2'. –

+0

Почему существуют два идентичных интерфейса, каждый из которых имеет один класс реализации? Очень вероятно, что вам просто нужен один интерфейс с двумя реализациями, и в этом случае вы можете иметь переменную-член из типа этого одного интерфейса. – amalloy

ответ

0

Я думаю, было бы проще сделать класс, содержащий метод «соединение» общедоступным, так как он будет доступен из всех пакетов.

+0

Это не совсем ответ – user3308485

0

Это похоже на действительно странную настройку, но я не стану подвергать вас сомнению.

Если вы знаете условие на сайте вызова метода (например, условие представляет собой флаг константы, переданный методу), вы можете параметризовать этот метод с помощью общего. Например:

public class TestGenerics { 
    public static interface A { 
     public void a(); 
    } 

    public static interface B { 
     public void a(); 
    } 

    public static class C implements A, B { 
     public void a() { 
      System.out.println("a"); 
     } 
    } 

    public static <T> T getCAsT() { 
     return (T) new C(); 
    } 

    public static void main(String[] args) { 
     A a = TestGenerics.<A>getCAsT(); 
     B b = TestGenerics.<B>getCAsT(); 
     a.a(); 
     b.a(); 
    } 
} 

В противном случае я попытался бы объединить два интерфейса в некотором роде.

+0

** public static class C реализует A **. и ** публичный статический класс D реализует B **. Изменит ли это ваш ответ – user3308485

+0

Если разные классы реализуют разные интерфейсы, я не вижу, что вы хотите делать. Является ли 'соединение 'экземпляром' C' или 'D'? – Rotten194

+0

Я хочу, чтобы соединение было экземпляром интерфейса 1 if (this) ... else Я хочу, чтобы соединение было экземпляром интерфейса2 – user3308485

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