Strategia per implementare il Multiple Dispatch

1

Questa è una domanda su come funziona Multiple Dispatch.

Supponiamo di avere una gerarchia di tipi come questa:

Drawable -> Shape -> Polygon -> Rectangle

E ci sono tre funzioni (Questo è uno pseudo-codice):

void func(Rectangle*, Drawable*, Drawable*) ...
void func(Rectangle*, Rectangle*, Drawable*) ...
void func(Polygon*, Rectangle*, Rectangle*) ...

Supponiamo che questa sia una parte di codice:

Drawable* x = create_rectangle();
Drawable* y = create_rectangle();
Drawable* z = create_rectangle();

Ovviamente i tipi di x,y,z sono tutti Drawable ma contengono istanze di Rectangle . Quale funzione verrà chiamata se scrivo: func(x, y, z) ?

Non abbiamo alcuna funzione che corrisponda ai tipi esatti di x, y and z , quindi cosa succede in questo caso?

    
posta mahdix 17.05.2017 - 16:41
fonte

2 risposte

2

Puoi implementare questo in molti modi. Il modo per me meno sorprendente è preferire la partita meno astratta e cercarla da sinistra a destra.

In questo caso significa che chiameresti:

void func(Rectangle*, Rectangle*, Drawable*) ...
    
risposta data 17.05.2017 - 16:54
fonte
1

Non posso parlare per altre lingue, ma dato il tuo codice postato,

func(x, y, z);

è un errore in C ++.

Vedi link .

Se decidi di implementare la spedizione dinamica in base a più argomenti, dovrai costruire tu stesso l'algoritmo. Se lo fai, una strategia ragionevole sarebbe quella di utilizzare la migliore funzione di corrispondenza in base al tipo di oggetto a cui gli argomenti puntano, da sinistra a destra.

Se sei in grado di implementare un meccanismo del genere,

func(x, y, z);

in definitiva dovrebbe chiamare:

void func(Rectangle*, Rectangle*, Drawable*);
    
risposta data 17.05.2017 - 17:01
fonte