Gli oggetti che possono superare più di un test IS-A sono veramente polimorfici?

0

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 #.

    
posta wolfrevo_kcats 02.10.2017 - 20:43
fonte

3 risposte

7

Sei confuso perché pensi all'ereditarietà e al polimorfismo come concetti separati. Ma in realtà l'ereditarietà è un possibile modo di implementare il polimorfismo, il che rende quest'ultimo il concetto più generale e l'ereditarietà una forma speciale del primo.

Quindi sì, come hai scritto (e come indicato anche nell'articolo a cui ti sei collegato), ogni oggetto di ogni classe in Java o C # è polimorfico, poiché derivano tutti da Object . E sì, "non appena una classe eredita da un'altra classe, diventa polimorfica" - è corretto. Tuttavia, il "contrario" non è obbligatorio: quando gli oggetti sono polimorfici, ciò non significa necessariamente che è coinvolta l'ereditarietà.

Questo è probabilmente più facile da capire quando hai visto esempi di ereditarietà del senza , come la tecnologia COM della componente di Microsoft, che non implementa nemmeno l'ereditarietà. Ad esempio, utilizzando l'associazione tardiva per i componenti COM, è possibile utilizzare gli oggetti in modo polimorfico senza una classe base comune o un'interfaccia comune definita esplicitamente. Un altro esempio è "polimorfismo statico" in Meta programmazione template C ++, o funzioni polimorfiche in Python, come mostrato qui .

    
risposta data 02.10.2017 - 22:08
fonte
3

Penso al polimorfismo come a una proprietà di un progetto. Se si dispone di un'interfaccia (che sia un'interfaccia "vera" o una classe base astratta o generica o altro) e che l'interfaccia sia implementata da più di un tipo reale che può avere istanze, si tratta di un progetto che implica il polimorfismo.

Non penso veramente al polimorfismo come alla qualità di una singola istanza.

Dall'articolo di wikipdia su polimorfismo , che sta citando Stroustrup:

... polymorphism is the provision of a single interface to entities of different types

Quindi, alcuni di noi non parlano di una singola istanza di oggetto come polimorfismo esibito, o come polimorfica.

Per come la vedo io è less su un singolo oggetto che è conforme a più di una interfaccia (cioè soddisfa più di uno è-a), e < strong> altro su un'interfaccia con più implementazioni. È vero che è difficile mostrare un esempio di uno senza sollevare l'altro, quindi lo vedo come una questione di concentrazione.

    
risposta data 02.10.2017 - 23:06
fonte
0

Usare un oggetto polimorficamente significa semplicemente utilizzarlo in un modo in cui l'utente non ha bisogno di sapere cosa sia realmente, solo come accedere ad alcune proprietà o comportamenti.
Programmare all'interfece / contratto invece che per tentativi ed errori è particolarmente cruciale per questo.

Questo può essere ottenuto in molti modi, come:

  • Tratti, come in Rust : un puntatore all'oggetto e un elenco di funzioni che accettano che quel puntatore faccia cose.
    Un esempio limitato di tratti sono delegati, come in C # e Java, o std::function in C ++.
  • Duck-typing, come staticamente con i modelli C ++, o dinamicamente con la maggior parte dei linguaggi di scripting.
  • Polimorfismo dinamico basato su classi, che fa riferimento a un oggetto di una classe da qualsiasi classe base / interfaccia o anche al tipo effettivo se può essere ulteriormente derivato.
risposta data 02.10.2017 - 23:52
fonte

Leggi altre domande sui tag