Наследование и приведение типов: это хорошая Java?

Взгляните на этот код (из здесь )

abstract class EntityA {
    AssocA myA;
    abstract void meet();
}

abstract class AssocA {
    int something;
    abstract void greet();
}

class AssocAConcrete extends AssocA {
    void greet() {
        System.out.println("hello");
    }
    void salute() {
        System.out.println("I am saluting.")
    }
}

class EntityAConcrete extends EntityA {
    void meet() {
        System.out.println("I am about to meet someone");
        ((AssocAConcrete)myA).salute();
    }
}

Есть два параллельных дерева наследования, для родительского класса и ассоциированного класса. Проблема в строке 23:

((AssocAConcrete) myA) .salute ();

Это неприятно, и у меня такие вещи есть по всему моему коду. Несмотря на то, что эта строка является частью конкретной реализации Entity, мне нужно напомнить ей, что я хочу использовать конкретную реализацию AssocA, AssocAConcrete.

Есть ли какая-то аннотация для объявления этой связи? Или есть лучший, более разговорный способ Java выразить этот замысел? Спасибо!


Это ответ на @Dave, потому что я хочу вставить код ...

Интересно! Таким образом, вызов будет выглядеть примерно так:

AssocAConcrete myAssoc = new Assoca();
EnitityA myEntity = new EntityA();
myEntity.setAssoc(myAssoc);
myAssoc.salute();

Да? Это действительно круто. Думаю воспользуюсь!

5
задан pitosalas 3 February 2012 в 20:34
поделиться