Τι είναι ο πολυμορφισμός, τι εξυπηρετεί και πώς χρησιμοποιείται;
Ο πολυμορφισμός είναι η ικανότητα να αντιμετωπίζετε μια κλάση αντικειμένων σαν να είναι η γονική κλάση.
Για παράδειγμα, ας υποθέσουμε ότι υπάρχει μια κλάση με το όνομα Ζώο και μια κλάση με το όνομα Σκύλος που κληρονομεί από το Ζώο. Ο πολυμορφισμός είναι η ικανότητα να αντιμετωπίζετε οποιοδήποτε αντικείμενο Dog ως αντικείμενο Animal, όπως παρακάτω:
Dog* dog = new Dog;
Animal* animal = dog;
Συνήθως αυτό αναφέρεται στην ικανότητα ενός αντικειμένου τύπου Α να συμπεριφέρεται όπως ένα αντικείμενο τύπου Β. Στον αντικειμενοστραφή προγραμματισμό αυτό επιτυγχάνεται συνήθως με την κληρονομικότητα. Μερικοί σύνδεσμοι της wikipedia για να διαβάσετε περισσότερα:
EDIT: διόρθωση των σπασμένων συνδέσμων.
Ας χρησιμοποιήσουμε μια αναλογία. Για ένα δεδομένο μουσικό σενάριο κάθε μουσικός που το παίζει δίνει τη δική του πινελιά στην ερμηνεία.
Ο μουσικός μπορεί να αφαιρεθεί με διεπαφές, το είδος στο οποίο ανήκει ο μουσικός μπορεί να είναι μια αφηρημένη κλάση που ορίζει ορισμένους γενικούς κανόνες ερμηνείας και κάθε μουσικός που παίζει μπορεί να μοντελοποιηθεί με μια συγκεκριμένη κλάση.
Αν είστε ακροατής του μουσικού έργου, έχετε μια αναφορά στο σενάριο π.χ. το 'Fuga and Tocata'του Bach'και κάθε μουσικός που το ερμηνεύει το κάνει πολυμορφικά με τον δικό της τρόπο.
Αυτό είναι απλώς ένα παράδειγμα ενός πιθανού σχεδιασμού (σε Java):
public interface Musician {
public void play(Work work);
}
public interface Work {
public String getScript();
}
public class FugaAndToccata implements Work {
public String getScript() {
return Bach.getFugaAndToccataScript();
}
}
public class AnnHalloway implements Musician {
public void play(Work work) {
// plays in her own style, strict, disciplined
String script = work.getScript()
}
}
public class VictorBorga implements Musician {
public void play(Work work) {
// goofing while playing with superb style
String script = work.getScript()
}
}
public class Listener {
public void main(String[] args) {
Musician musician;
if (args!=null && args.length > 0 && args[0].equals("C")) {
musician = new AnnHalloway();
} else {
musician = new TerryGilliam();
}
musician.play(new FugaAndToccata());
}