2014-08-26 3 views
0

У меня естьInstance одного класса в другой класс

public abstract class A 
{ 
    public abstract A get(); 
} 

и

public abstract class B 
{ 
    public abstract void save(A a); 
} 

И кучу разных классов, расширяющих эти два класса.
И они обычно спарены вместе. Так что, если у меня есть классы C, D
Тогда C продолжит A и D продолжит B, а функция сохранения D будет ожидать C, чтобы он работал.

И у меня есть контроллер E

public class E 
{ 
    List<B> list; 

    public void save(A a) 
    { 
     // how do I choose correct pair from list? 
    } 
} 

В этом контроллере у меня есть список классов, расширяющих B.
Существует функция сохранения в Е, получает расширенный класс А в качестве аргумента.
Как мне пройти через все элементы в списке и выяснить, какой класс принадлежит к тому, что в паре?

Спасибо всем за помощь, я пытаюсь изучить сложные абстрактные классы и как их связать.

EDIT: Если я использую экземпляр, то у меня будет огромная, если заявления в 100 классах

Скажем, у меня есть 100 классов, расширяющих класс А и 100, которые расширяют класс B.
Они спаренный как я объяснил выше.

Так как дополнительное разъяснение.

public class D extends B 
{ 
    public void save(A a) 
    { 
     C c = (C)a.get(); 
     // proceed saving using c 
    } 
} 

Как избежать проверки, например, внутри всех этих классов, и знать, как их соединить? Нет ли лучшего способа?

EDIT2: Ответ Pshemo велик, однако у меня есть один последний вопрос для решения.

В классе E У меня есть функция сохранения, которая получает класс A
Как узнать, с каким классом связан A?
Если класс A является экземпляром C, как я знаю, для поиска экземпляра D в списке и вызова функции сохранения классов?

+2

Быстрый грязный способ: использовать 'instanceof'. Правильный способ: не используйте для этого наследование. –

+0

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

+1

Я думаю, вам нужно прояснить это несколько.Я не совсем понимаю, что вы подразумеваете под «выяснить, к какому классу принадлежит тот, который в паре». Я думаю, вы должны добавить код, который демонстрирует то, что вы пытаетесь выполнить, и просто сделать что-то для тех частей, где вы не знаете, как писать правильный Java-код. – ajb

ответ

2

Я не уверен, если это то, что вам нужно, но, похоже, вы можете захотеть изменить B класс что-то вроде

abstract class B<T extends A> { 
    public abstract void save(T a); 
} 

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

class D extends B<C> { 
    public void save(C a) {} 
} 
+0

Это отличный :) еще один вопрос. В классе E, когда я просматриваю все экземпляры класса B, как мне понять эту ссылку? Поэтому, если функция сохранения класса E получает класс C, как мне понять, что мне нужно вызвать экземпляр функции сохранения класса D, а не какую-либо функцию сохранения другого класса? – Quillion

+0

@Quillion Извините за поздний ответ, мне нужно было отправиться в АФК. Существует несколько стратегий, и каждый из них имеет свои плюсы и минусы. Например, вместо List вы можете использовать «Map , B>', который будет хранить экземпляры 'B', такие как' D1', 'D2,' D3' или другие, и в 'save (A a)' вы могли бы использовать что-то например, map.get (a.getClass()). save (a) '. – Pshemo

+0

@Quillion Другой подход может содержать информацию о том, какое расширение 'B' должно использоваться в' C'. Вы можете сделать это разными способами (1) хранить литерал класса (экземпляр класса), (2) или, возможно, сделать классы, расширяющие синглетоны B и метод 'C' add, который вернет экземпляр этой реализации. – Pshemo

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