Ho una classe base astrattametodi astratti statici in C++
class IThingy
{
virtual void method1() = 0;
virtual void method2() = 0;
};
voglio dire - "tutte le classi che forniscono un'esemplificazione concreta devono fornire questi metodi statici troppo"
Sono tentato di fare
class IThingy
{
virtual void method1() = 0;
virtual void method2() = 0;
static virtual IThingy Factory() = 0;
};
So che non viene compilato e comunque non è chiaro come utilizzarlo anche se è stato compilato. E comunque posso solo fare
Concrete::Factory(); // concrete is implementation of ITHingy
senza menzionare Fabbrica nella classe base affatto.
Ma credo che ci dovrebbe essere un modo di esprimere il contratto a cui voglio che le implementazioni si iscrivano.
Esiste un linguaggio ben noto per questo? O lo metto nei commenti? Forse non dovrei provare a forzare questo comunque
Modifica: ho potuto sentire me stesso essere vago come ho digitato la domanda. Ho appena sentito che dovrebbe esserci un modo per esprimerlo. Igor dà una risposta elegante ma in realtà dimostra che in realtà non aiuta. Ho ancora finire dover fare
IThingy *p;
if(..)
p = new Cl1();
else if(..)
p = new Cl2();
else if(..)
p = new Cl3();
etc.
Credo lingue riflettenti come C#, Python o Java potrebbe offrire una soluzione migliore
Non sono abbastanza sicuro di quello che vuoi. Stai cercando un metodo 'clone'? – GManNickG
Immagino di non vedere davvero una situazione del mondo reale in cui avresti bisogno di qualcosa del genere? Il polimorfismo ha davvero senso solo con istanze reali. I metodi statici sono solo funzioni regolari che usano il nome della classe per MRO. Non ha davvero senso, a un certo punto devi conoscere il nome del metodo class ::, perché C++ è collegato staticamente. – rossipedia
Sembra che voglia specificare che le sottoclassi hanno un metodo Factory statico. E Bryan, dovresti spostarlo nello spazio di risposta. – jdmichal