Η κληρονομικότητα είναι βασική έννοια στον αντικειμενοστρεφή προγραμματισμό (OOP). Αντιπροσωπεύει μια σχέση IS-A. Στον προγραμματισμό σημαίνει κυριολεκτικά ό,τι σημαίνει και στα αγγλικά: την κληρονόμηση χαρακτηριστικών από τον γονέα (στον προγραμματισμό, τα χαρακτηριστικά είναι συνήθως συναρτήσεις και μεταβλητές).
Ας δούμε μια κλάση, την Animal, όπως φαίνεται,
//Creating an Animal class with bark() as a member function.
public class Animal {
public void bark() {
System.out.println("This is an animal");
}
}
Η Animal είναι μια γονική κλάση, επειδή οι ιδιότητες που έχει αυτή η κλάση μπορούν να επεκταθούν σε όλα τα ζώα γενικά.
Ας δούμε ένα ζώο με όνομα Lion, που έχει μια κλάση όπως,
//Lion class is a child class of Animal.
public class Lion extends Animal {
@Override
public void bark() {
System.out.println("Lion here!!");
}
}
Η σημείωση Override χρησιμοποιείται για να δείξει ότι μια μέθοδος σε μια υποκλάση παρακάμπτει μια μέθοδο της υπερκλάσης της.
Δεν είναι απολύτως απαραίτητη, αλλά είναι καλή πρακτική να τη χρησιμοποιείς.
Τώρα, όποτε κάνεις το παρακάτω,
Animal animal = new Lion(); //creating instance of Animal, of type Lion
animal.bark();
Σημείωση: Αρχικοποιείς την κλάση Animal με Lion.
Η έξοδος θα μοιάζει με:
Lion here!!
Σύμφωνα με τον αντικειμενοστρεφή προγραμματισμό, υπάρχουν πολλοί τύποι κληρονομικότητας, αλλά η Java υποστηρίζει μόνο κάποιους από αυτούς (πολλαπλών επιπέδων και ιεραρχική). Για να διαβάσεις περισσότερα σχετικά, διάβασε αυτό.
Σε αυτή την άσκηση παίζεις ένα παιχνίδι ρόλων όπου διαφορετικοί τύποι μαχητών μπορούν να μονομαχήσουν μεταξύ τους. Το παιχνίδι έχει διαφορετικούς κανόνες για κάθε τύπο μαχητή. Θα επικεντρωθούμε σε δύο συγκεκριμένους τύπους: Wizards και Warriors.
Για έναν Warrior, οι κανόνες είναι οι εξής:
6 πόντους ζημιάς αν ο μαχητής που επιτίθεται δεν είναι ευάλωτος.10 πόντους ζημιάς αν ο μαχητής που επιτίθεται είναι ευάλωτος.Για έναν Wizard, οι κανόνες είναι οι εξής:
12 πόντους ζημιάς αν έχει προετοιμάσει ένα ξόρκι εκ των προτέρων.3 πόντους ζημιάς αν δεν έχει προετοιμάσει ένα ξόρκι εκ των προτέρων.Δημιούργησε μια νέα κλάση που ονομάζεται Warrior.
Αυτή η κλάση θα πρέπει να κληρονομεί από την υπάρχουσα κλάση Fighter.
Ενημέρωσε την κλάση Warrior ώστε η μέθοδος toString() της να περιγράφει τι είδους μαχητής είναι.
Η μέθοδος θα πρέπει να επιστρέφει τη συμβολοσειρά "Fighter is a Warrior".
Warrior warrior = new Warrior();
warrior.toString();
// => "Fighter is a Warrior"
Ενημέρωσε την κλάση Warrior ώστε η μέθοδος isVulnerable() της να επιστρέφει πάντα false.
Warrior warrior = new Warrior();
warrior.isVulnerable();
// => false
Ενημέρωσε την κλάση Warrior ώστε η μέθοδος getDamagePoints(Fighter) της να υπολογίζει τη ζημιά που προκαλεί ένας Warrior σύμφωνα με τους παραπάνω κανόνες.
Warrior warrior = new Warrior();
Wizard wizard = new Wizard();
warrior.getDamagePoints(wizard);
// => 10
Δημιούργησε άλλη μια νέα κλάση που ονομάζεται Wizard.
Αυτή η κλάση θα πρέπει επίσης να κληρονομεί από την υπάρχουσα κλάση Fighter.
Ενημέρωσε την κλάση Wizard ώστε η μέθοδος toString() της να περιγράφει τι είδους μαχητής είναι.
Η μέθοδος θα πρέπει να επιστρέφει τη συμβολοσειρά "Fighter is a Wizard".
Wizard wizard = new Wizard();
wizard.toString();
// => "Fighter is a Wizard"
Ενημέρωσε την κλάση Wizard ώστε να προσθέσεις μια μέθοδο που ονομάζεται prepareSpell().
Η κλάση θα πρέπει να θυμάται πότε καλείται αυτή η μέθοδος και να διασφαλίζει ότι η μέθοδος isVulnerable() της επιστρέφει false μόνο όταν έχει προετοιμαστεί ένα ξόρκι.
Wizard wizard = new Wizard();
wizard.prepareSpell();
wizard.isVulnerable();
// => false
Ενημέρωσε την κλάση Wizard ώστε η μέθοδος getDamagePoints(Fighter) της να υπολογίζει τη ζημιά που προκαλεί ένας Wizard σύμφωνα με τους παραπάνω κανόνες.
Wizard wizard = new Wizard();
Warrior warrior = new Warrior();
wizard.prepareSpell();
wizard.getDamagePoints(warrior);
// => 12
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Java με 26 έννοιες158 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.