27

Ho alcune domande sul concetto di polimorfismo statico Qualche volta ho sentito parlare; puoi interpretarli principalmente nel contesto del C++, ma apprezzerei le risposte indipendenti dal linguaggio, laddove applicabile (quindi taggando sia C++ che agnostico della lingua).Definizione e implementazione del polimorfismo statico

  1. Come possiamo definire polimorfismo statico in generale? Come esempio, ritengo che la funzione std::sort da C++ è considerato staticamente polimorfico in quanto dipende da alcuni interfaccia fornita da alcuni oggetti che comportano come iteratori, e il comportamento esatto sotto l'interfaccia forniti iteratori può essere determinato nel tempo di compilazione. Questa spiegazione spiega come definiamo il polimorfismo statico, o è solo una descrizione di un caso specifico e c'è dell'altro?

  2. Quali sono i pattern di codice comuni dell'utilizzo del polimorfismo statico in C++? Inoltre: SP è il solo raggiunto tramite modelli in C++?

  3. È vero che una determinata classe diagramma UML non si direttamente descrivere come il polimorfismo è gestito e, quindi, può essere almeno parzialmente assolti o statico o dinamico? In altre parole: la scelta del polimorfismo statico o dinamico è indipendente dal modello OOP, e quindi fino a che l'implementatore decide?

  4. Il polimorfismo statico è solo C++ - specifico e relativo al funzionamento dei modelli? In caso contrario, è presente in altre lingue tradizionali oltre al C++? Possiamo avere un equivalente di polimorfismo statico in Java, C# .. qualcosa, e porterà qualche vantaggio?

  5. Il più importante ... Quali sono i vantaggi effettivi dell'utilizzo del polimorfismo statico? Penso che possiamo essere d'accordo sul fatto che riduce la flessibilità del codice; quali sono i vantaggi, inoltre - nel caso del C++ - salvando un puntatore di riferimento (funzione virtuale/puntatore-a-funzione/costo del delegato)? Qual è la classe di problemi in cui il polimorfismo statico è particolarmente utile, la scelta giusta per l'implementazione?

+0

Possiamo convenire che riduce la flessibilità del codice ?? –

+1

Penso che intendesse "complessità" o forse "ridondanza". –

+0

No, intendevo la flessibilità; partendo dal presupposto che tutti i progetti con polimorfismo statico possono essere implementati con polimorfismo dinamico, ma non nel contrario, l'utilizzo di polimorfismo statico per un caso specifico implica che in futuro potrebbe sorgere la necessità di riscriverlo in modo dinamico, se i requisiti cambiano. Solo il mio modo di pensare è – Kos

risposta

13
  1. Il comportamento polimorfico statico è type polymorphism che si verifica in fase di compilazione anziché in fase di esecuzione.
  2. Sì.
  3. UML riguarda il modo in cui le classi interagiscono in fase di esecuzione: non credo che esista un formato UML per la descrizione dei modelli, ma potrei sbagliarmi.
  4. Per quanto ne so, è specifico C++, ma non sono positivo dato che non ho usato tutte le lingue mai inventate. :) Detto questo, linguaggi JIT come C# e Java spesso sono molto bravi a rimuovere l'impatto sulle prestazioni delle chiamate indirette in alcuni casi utilizzando le informazioni raccolte in fase di esecuzione piuttosto che in fase di compilazione. Se questo è in fase di compilazione o meno è piuttosto in aria però ... dopo tutto, si chiama Compilatore Just-In-Time .
  5. Il principale vantaggio è semplicemente la prestazione. polimorfismo runtime può fare tutto il polimorfismo statico può fare (in realtà si può fare di più), ma porta il costo delle chiamate indirette (che può essere costoso se ci sono abbastanza di 'em)

Ora, i modelli stessi hanno molti usi oltre a raggiungere il polimorfismo del tempo di compilazione - ad esempio la magia di SFINAE che rende il lavoro boost::bind non è certamente polimorfico - è solo lì per appianare le incongruenze nella lingua stessa.

+3

"2. Sì." Che dire dell'overloading delle funzioni? –

+1

@Charles: Non ho mai sentito nessuno chiamare sovraccaricare "polimorfismo statico" prima (anche se credo che sia adatto). –

+0

Dipende da come rispondi (1), ovviamente. –

5

Come possiamo definire il polimorfismo statico in generale?

Il modo migliore per capirlo usando degli esempi. Policy Based Design è un esempio di polimorfismo statico. E a mio parere, è una tecnica molto potente per ottenere il polimorfismo statico.

Un altro esempio è, Curiously recurring template pattern (CRTP) che è anche una tecnica potente.

Problemi correlati