2010-07-27 9 views
6

Mi sono guardato intorno e non ho trovato nessuna domanda simile.Perché Wikipedia dice "Il polimorfismo non è la stessa cosa dell'overload del metodo o della sovrascrittura del metodo".

Ecco il punto che ho ricevuto da Wikipedia:

polimorfismo non è la stessa come metodo di sovraccarico o il metodo prevalente. Il polimorfismo riguarda solo l'applicazione di implementazioni specifiche a un'interfaccia oa una classe di base più generica. L'overloading del metodo si riferisce a metodi che hanno lo stesso nome ma diverse firme all'interno della stessa classe. L'override del metodo è il punto in cui una sottoclasse sostituisce l'implementazione di uno o più metodi dei suoi genitori. Né l'overloading né l'override del metodo sono di per sé implementazioni del polimorfismo.

Qualcuno potrebbe spiegarlo in modo più chiaro, in particolare la parte "Il polimorfismo non è la stessa del metodo prioritario"? Sono confuso ora. Grazie in anticipo.

+1

BTW, titolo scarso. Dovresti riscriverlo su "Qual è la differenza tra polimorfismo e metodo di sovrascrittura/sovraccarico" =) –

+1

Nota che la citazione in questa domanda (dal 2010) non è più nell'articolo oggi (2014). L'articolo ha ora una sezione separata sul * polimorfismo ad hoc *, che è una classe di polimorfismo che include l'overloading di funzioni. – DaoWen

risposta

6

Polimorfismo (molto semplicemente detto) la possibilità di utilizzare una classe derivata cui è prevista una classe di base:

class Base { 

} 

class Derived extends Base { 

} 

Base v = new Derived(); // OK 

Metodo prevalente, d'altra parte, è come dice Wiki un modo per modificare il comportamento metodo in una classe derivata:

class Shape { 
    void draw() { /* Nothing here, could be abstract*/ } 
} 

class Square extends Shape { 
    @Override 
    void draw() { /* Draw the square here */ } 
} 

sovraccarico è correlata alla successione, esso permette di definire più funzioni con lo stesso nome che si differenziano solo per degli argomenti necessari.

+0

Grazie mille! Ho letto di nuovo quell'articolo e ora tutto è abbastanza chiaro. –

1

Quando si esegue l'override di un metodo, si modifica l'implementazione. Il polimorfismo utilizzerà la tua implementazione o un'implementazione di base, a seconda della tua lingua (supporta i metodi virtuali?) E in base all'istanza della classe che hai creato.

Il sovraccarico di un metodo è un'altra cosa, significa utilizzare lo stesso metodo con una quantità diversa di parametri.

La combinazione di questo (sovrascrittura), oltre alla possibilità di utilizzare le classi di base o le interfacce e chiamare ancora un metodo sovrascritto da qualche parte sulla catena, viene chiamato polimorfismo.

Esempio:

interface IVehicle 
{ 
    void Drive(); 
} 

class Car : IVehicle 
{ 
    public Drive() { /* drive a car */ } 
} 

class MotorBike : IVehicle 
{ 
    public Drive() { /* drive a motorbike */ } 
} 

class Program 
{ 
    public int Main() 
    { 
     var myCar = new Car(); 
     var myMotorBike = new MotorBike(); 
     this.DriveAVehicle(myCar);  // drive myCar 
     this.DriveAVehicle(myMotorBike); // drive a motobike 
     this.DriveAVhehicle();   // drive a default car 
    } 

    // drive any vehicle that implements IVehicle 
    // this is polymorphism in action 
    public DriveAVehicle(IVehicle vehicle) 
    { 
     vehicle.Drive(); 
    } 

    // overload, creates a default car and drives it 
    // another part of OO, not directly related to polymorphism 
    public DriveAVehicle() 
    { 
     // typically, overloads just perform shortcuts to the method 
     // with the real implemenation, making it easier for users of the class 
     this.DriveAVehicle(new Car()); 
    } 
} 
+0

Non penso che il polimorfismo = sovraccarico + override, il sovraccarico è in realtà correlato non orientato agli oggetti. È possibile sovraccaricare utilizzando C. –

+0

@Clement: Penso che la sua frase finale potrebbe essere stata formulata in modo scadente (penso che "questo" intendesse applicarsi alla sovrascrittura, non al sovraccarico). –

+0

@Clement/@Adam: avete entrambi ragione: l'overloading è un concetto base di OO (ma anche di lingue non OO, controllo OOSC pagina 95), ma non di polimorfismo di per sé. Tuttavia, gli implementatori linguistici devono occuparsi delle risoluzioni di sovraccarico quando risolvono problemi di polimorfismo. Ho rimosso l'ambiguità. – Abel

2

polimorfismo non si tratta di metodi che sono sovrascritti; si tratta degli oggetti che determinano l'implementazione di un particolare processo. Un esempio semplice, ma non l'unico esempio, è l'ereditarietà:

Un romanzo è un tipo di libro. Ha la maggior parte degli stessi metodi e tutto ciò che puoi fare per un libro può anche essere fatto per un romanzo. Pertanto, qualsiasi metodo che accetta un libro come argomento può anche trattare un romanzo come argomento. (L'esempio include .read(), .write(), .burn()). Questo è, di per sé, non riferito al fatto che un romanzo può sovrascrivere un metodo di libro. Invece, si riferisce a una funzionalità di astrazione. Se un professore assegna un libro da leggere, a lui/lei non importa come lo leggi - solo che lo fai. Allo stesso modo, a un programma chiamante non interessa come viene letto un oggetto di tipo Libro, solo che lo è. Se l'oggetto è un romanzo, verrà letto come un romanzo. Se non è un romanzo ma è ancora un libro, sarà letto come un libro.

libro:

private void read(){ 

#Read the book. 
} 

Novel:

private void read(){ 

#Read a book, and complain about how long it is, because it's a novel! 

} 

metodi coppia è appena riferiti ad avere due metodi con lo stesso nome, ma un diverso numero di argomenti.Esempio:

writeNovel(int numPages, String name) 

writeNovel(String name) 
2

Il sovraccarico sta avendo, nella stessa classe, molti metodi con lo stesso nome, ma diversi parametri.

L'override sta avendo, in una classe ereditata, lo stesso metodo + parametri di una classe base. Quindi, a seconda della classe dell'oggetto, verrà chiamato il metodo base o il metodo ereditato.

Il polimorfismo è il fatto che un'istanza di una classe ereditata può sostituire un'istanza di una classe base, quando viene fornita come parametro.

E.g. :

class Shape { 
    public void draw() { 
    //code here 
    } 
    public void draw(int size) { 
    //this is overloading 
    } 
} 

class Square inherits Shape { 
    public void draw() { 
    //some other code : this is overriding 
    } 

    public void draw(color c) { 
    //this is overloading too 
    } 
} 

class Work { 
    public myMethod(Shape s) { 
    //using polymophism, you can give to this method 
    //a Shape, but also a Square, because Square inherits Shape. 
    } 
} 

Vedere? Il polimorfo è il fatto che, lo stesso oggetto, può essere usato come istanza della sua classe, della sua classe base o anche come interfaccia.

+0

Proprio come un dato di fatto, il sovraccarico non deve avvenire nella stessa classe (le classi figlie sono libere di definire sovraccarichi aggiuntivi). –

+0

@Adam Robinson: hai ragione, lo aggiorno per chiarire. –

3

È possibile avere il polimorfismo in una lingua che non consente l'override del metodo (o persino l'ereditarietà). per esempio. avendo diversi oggetti diversi implementano la stessa interfaccia. Polymorphism significa semplicemente che puoi avere diverse implementazioni concrete della stessa interfaccia astratta. Alcune lingue scoraggiano o impediscono l'ereditarietà, ma consentono questo tipo di polimorfismo nello spirito della programmazione con le astrazioni.

In teoria, si potrebbe anche eseguire l'override del metodo senza polimorfismo in un linguaggio che non consente l'invio di metodi virtuali. L'effetto sarebbe che potresti creare una nuova classe con metodi sovrascritti, ma non potresti utilizzarla al posto della classe genitore. Non sono a conoscenza di alcun linguaggio mainstream che faccia questo.

1

Il polimorfismo si riferisce al fatto che un'istanza di un tipo può essere trattata come qualsiasi istanza di uno qualsiasi dei suoi supertipi. Il polimorfismo significa "molte forme".

Supponiamo che tu abbia un tipo chiamato Cane. Quindi hai un tipo chiamato Spaniel che eredita da Dog. Un'istanza di Spaniel può essere utilizzata ovunque venga utilizzato un cane - può essere trattata come qualsiasi altra istanza di Cane. Questo è il polimorfismo.

L'override del metodo è ciò che una sottoclasse può eseguire sui metodi in una classe base. Il cane può contenere un metodo di corteccia. Spaniel può sovrascrivere quel metodo per fornire un'implementazione più specifica. I metodi di sovrascrittura non influiscono sul polimorfismo: il fatto che tu abbia sostituito un metodo Dog in Spaniel non ti abilita o ti impedisce di trattare uno Spaniel come un cane.

L'overloading del metodo è semplicemente l'atto di dare metodi diversi che prendono diversi parametri con lo stesso nome.

Spero che questo aiuti.

1

francamente:

Polimorfismo utilizza molti tipi che hanno determinate cose in comune in uno attuazione che necessita solo cose comuni, dove come sovraccarico metodo utilizza uno attuazione ogni tipo .

Problemi correlati