Un numero di tutorial su polymorphism state che "Qualsiasi oggetto che può superare più di un test IS-A è considerato come polimorfico. " Mi chiedo che cosa intendano per quello, e se è addirittura una dichiarazione vera.
Dalla mia comprensione, il polimorfismo (sottotipo) si ha quando si ha l'interfaccia della classe base e l'implementazione della classe derivata. Quale sarebbe simile a questo:
Shape myShape = new Circle();
Ma l'implicazione di ogni oggetto che supera più di un test IS-A polimorfico è che ogni oggetto di ogni classe in Java o C # è sempre polimorfico. ([Ad eccezione degli oggetti di tipo Object.] Poiché ogni classe eredita da Object.) In altre parole questo sarebbe un esempio di polimorfismo:
Shape myShape = new Shape();
Questo non ha senso per me dal momento che sappiamo per certo che l'ereditarietà e il polimorfismo sono due concetti separati. Ma questo implica che sono effettivamente la stessa cosa, perché non appena una classe eredita da un'altra classe, diventa polimorfica.
Ho cercato di capire alcune possibili spiegazioni sul perché l'hanno detto. Queste sono le mie ipotesi:
- Forse essere "polimorfici" e usare il polimorfismo sono due cose diverse. Potrebbe essere che dire che una classe è polimorfica non significa necessariamente che la classe stia usando il polimorfismo in quel momento esatto, ma piuttosto che abbia il potenziale di usare il polimorfismo.
- Dato che il polimorfismo è possibile a causa del CLR che utilizza una tabella di funzioni virtuale, forse il CLR usa il vtable in modo simile durante l'ereditarietà come nel polimorfismo, ed è per questo che hanno detto che una classe che passa più I test IS-A sono polimorfici. (idk, questa è solo una supposizione.)
- Secondo Bob Martin, frasi come "IS-A" e "HAS-A" sono residui di programmazione di intelligenza artificiale e non riflettono accuratamente le relazioni tra le classi in OOP. Tuttavia, se una classe è più di una cosa, allora ci vorrebbe "molte forme" in una vaga interpretazione della parola "polimorfismo". Sappiamo che il "polimorfismo" è una parola così vaga che può persino includere un polimorfismo ad-hoc (overloading del metodo), anche se non è proprio un polimorfismo.
Non lo so. Queste sono solo supposizioni sul perché hanno affermato che una classe che può superare più di un test IS-A è polimorfica. E per chiarire, l'articolo parla del polimorfismo del sottotipo in Java. Anche se, penso che funzioni allo stesso modo di C #.