2015-08-06 1 views
1

J'ai une classe parent abstraite Parent et six classes enfant ChildA si ChildF.Java envoyer à la classe enfant lorsque la variable est de la classe parent abstraite

Une autre classe Other a six méthodes surchargées (statiques) olmeth(), une pour chacune des six classes enfants.

Comment puis-je écrire:

Parent message = Factory.returnRandomChildClass(); 
Other.olmeth(message); 

Au moment où j'utilise une méthode supplémentaire, surcharge pour la classe parente, et six instanceof contrôles pour contourner ce problème. Ceci est non scalable.

Comment puis-je obtenir Java pour expédier sur la réelle type de message plutôt sur le type de la référence au message?

+0

Avec ce motif, vous ne pouvez pas. –

Répondre

2

Faire une méthode abstraite dans la Parent, et que chaque envoi de l'enfant à sa propre static surcharge:

abstract class Parent { 
    protected abstract void send(); 
} 
class ChildA extends Parent { 
    protected void send() { 
     Other.olmeth(this); 
    } 
} 
class ChildB extends Parent { 
    protected void send() { 
     Other.olmeth(this); 
    } 
} 
... 
class ChildF extends Parent { 
    protected void send() { 
     Other.olmeth(this); 
    } 
} 

Notez que bien que le code dans les six implémentations de send() se ressemblent exactement, les méthodes répartissent réellement à six surcharges différentes de Other, parce que le type statique de this dans chaque le cas est différent.

1

Utilisez le modèle double dispatch. Mettre en œuvre la logique olmeth pour chaque classe enfant Parent et changer votre méthode olmeth actuelle à ceci:

static void olmeth(Parent p) { 
    p.olemth(); 
}