Operazione a coppie per sottoclassi della stessa classe

0

Supponiamo di avere più istanze I1 , I2 , I3 , ecc. di un insieme di classi C1 , C2 , ecc. Supponiamo che queste classi ereditino tutte da una super-classe S .

Supponiamo che ci sia un'operazione O(a, b) che richiede due istanze di S e verifica se sono compatibili (in alcuni casi è compatibile.) Per verificare la compatibilità, tuttavia, O deve conoscere il tipo di a e b ( C1 , o C2 , ...) e l'operazione può essere eseguita solo una volta che i tipi sono noti.

Il modo basilare per implementare O sarebbe quello di scrivere se le istruzioni ovunque per controllare i tipi e quindi eseguire l'operazione. Questo non è l'ideale perché ci sono molti casi da coprire e perché non è estendibile.

Esiste un modello associato a questo tipo di problemi? È possibile scrivere un'operazione estensibile basata sui tipi?

    
posta Husain 18.10.2017 - 20:28
fonte

1 risposta

1

Penso che il pattern che stai cercando sia il pattern Visitor insieme a double-dispatch

Una buona domanda SO Ho trovato qui si applica

L'essenza di ciò è che tu hai un oggetto con un metodo "Accetta" che ha come oggetto un oggetto "visitatore". Ecco un esempio in C ++ (scusa se questo non è quello che stai usando)

//each subtype of object will override this function and will have the same body
virtual Object::Accept(Visitor* v){
    v->visit(this);
}

L'oggetto si passa al metodo Visit del visitatore. Ecco la parte interessante

class Visitor{
   Vist(ObjectSub1* s);
   Vist(ObjectSub2* s);
   Vist(ObjectSub3* s);
}

La chiave è che Object :: Accept è sovraccarico per ogni sottotipo per passare 'this' (che restituisce un puntatore al sottotipo corrente). Fondamentalmente, ogni sottotipo sa quale sottotipo è, quindi quando passa alla funzione visitatore sovraccarico "Visit" viene chiamata la funzione corretta

    
risposta data 18.10.2017 - 22:35
fonte

Leggi altre domande sui tag