Διαδρομές
/
Java
Java
/
Ασκήσεις
/
Μάγοι και πολεμιστές
Μάγοι και πολεμιστές

Μάγοι και πολεμιστές

Άσκηση εκμάθησης

Εισαγωγή

Κληρονομικότητα

Η κληρονομικότητα είναι βασική έννοια στον αντικειμενοστρεφή προγραμματισμό (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!!");
    }

}
Note

Η σημείωση Override χρησιμοποιείται για να δείξει ότι μια μέθοδος σε μια υποκλάση παρακάμπτει μια μέθοδο της υπερκλάσης της. Δεν είναι απολύτως απαραίτητη, αλλά είναι καλή πρακτική να τη χρησιμοποιείς.

Τώρα, όποτε κάνεις το παρακάτω,

Animal animal = new Lion(); //creating instance of Animal, of type Lion
animal.bark();

Σημείωση: Αρχικοποιείς την κλάση Animal με Lion. Η έξοδος θα μοιάζει με:

Lion here!!

Σύμφωνα με τον αντικειμενοστρεφή προγραμματισμό, υπάρχουν πολλοί τύποι κληρονομικότητας, αλλά η Java υποστηρίζει μόνο κάποιους από αυτούς (πολλαπλών επιπέδων και ιεραρχική). Για να διαβάσεις περισσότερα σχετικά, διάβασε αυτό.

Οδηγίες

Σε αυτή την άσκηση παίζεις ένα παιχνίδι ρόλων όπου διαφορετικοί τύποι μαχητών μπορούν να μονομαχήσουν μεταξύ τους. Το παιχνίδι έχει διαφορετικούς κανόνες για κάθε τύπο μαχητή. Θα επικεντρωθούμε σε δύο συγκεκριμένους τύπους: Wizards και Warriors.

Για έναν Warrior, οι κανόνες είναι οι εξής:

  • Ένας Warrior δεν είναι ποτέ ευάλωτος.
  • Ένας Warrior προκαλεί 6 πόντους ζημιάς αν ο μαχητής που επιτίθεται δεν είναι ευάλωτος.
  • Ένας Warrior προκαλεί 10 πόντους ζημιάς αν ο μαχητής που επιτίθεται είναι ευάλωτος.

Για έναν Wizard, οι κανόνες είναι οι εξής:

  • Ένας Wizard μπορεί να προετοιμάσει ένα ξόρκι εκ των προτέρων.
  • Ένας Wizard είναι ευάλωτος εκτός αν έχει προετοιμάσει ένα ξόρκι εκ των προτέρων.
  • Ένας Wizard προκαλεί 12 πόντους ζημιάς αν έχει προετοιμάσει ένα ξόρκι εκ των προτέρων.
  • Ένας Wizard προκαλεί 3 πόντους ζημιάς αν δεν έχει προετοιμάσει ένα ξόρκι εκ των προτέρων.

1. Δημιούργησε την κλάση Warrior

Δημιούργησε μια νέα κλάση που ονομάζεται Warrior. Αυτή η κλάση θα πρέπει να κληρονομεί από την υπάρχουσα κλάση Fighter.

2. Περιέγραψε έναν Warrior

Ενημέρωσε την κλάση Warrior ώστε η μέθοδος toString() της να περιγράφει τι είδους μαχητής είναι. Η μέθοδος θα πρέπει να επιστρέφει τη συμβολοσειρά "Fighter is a Warrior".

Warrior warrior = new Warrior();
warrior.toString();
// => "Fighter is a Warrior"

3. Κάνε τους Warriors άτρωτους

Ενημέρωσε την κλάση Warrior ώστε η μέθοδος isVulnerable() της να επιστρέφει πάντα false.

Warrior warrior = new Warrior();
warrior.isVulnerable();
// => false

4. Υπολόγισε τους πόντους ζημιάς για έναν Warrior

Ενημέρωσε την κλάση Warrior ώστε η μέθοδος getDamagePoints(Fighter) της να υπολογίζει τη ζημιά που προκαλεί ένας Warrior σύμφωνα με τους παραπάνω κανόνες.

Warrior warrior = new Warrior();
Wizard wizard = new Wizard();

warrior.getDamagePoints(wizard);
// => 10

5. Δημιούργησε την κλάση Wizard

Δημιούργησε άλλη μια νέα κλάση που ονομάζεται Wizard. Αυτή η κλάση θα πρέπει επίσης να κληρονομεί από την υπάρχουσα κλάση Fighter.

6. Περιέγραψε έναν Wizard

Ενημέρωσε την κλάση Wizard ώστε η μέθοδος toString() της να περιγράφει τι είδους μαχητής είναι. Η μέθοδος θα πρέπει να επιστρέφει τη συμβολοσειρά "Fighter is a Wizard".

Wizard wizard = new Wizard();
wizard.toString();
// => "Fighter is a Wizard"

7. Επίτρεψε στους Wizards να προετοιμάζουν ένα ξόρκι και κάνε τους ευάλωτους όταν δεν έχουν προετοιμάσει ξόρκι

Ενημέρωσε την κλάση Wizard ώστε να προσθέσεις μια μέθοδο που ονομάζεται prepareSpell(). Η κλάση θα πρέπει να θυμάται πότε καλείται αυτή η μέθοδος και να διασφαλίζει ότι η μέθοδος isVulnerable() της επιστρέφει false μόνο όταν έχει προετοιμαστεί ένα ξόρκι.

Wizard wizard = new Wizard();
wizard.prepareSpell();
wizard.isVulnerable();
// => false

8. Υπολόγισε τους πόντους ζημιάς για έναν Wizard

Ενημέρωσε την κλάση Wizard ώστε η μέθοδος getDamagePoints(Fighter) της να υπολογίζει τη ζημιά που προκαλεί ένας Wizard σύμφωνα με τους παραπάνω κανόνες.

Wizard wizard = new Wizard();
Warrior warrior = new Warrior();

wizard.prepareSpell();
wizard.getDamagePoints(warrior);
// => 12
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Java Exercism

Έτοιμος να ξεκινήσεις την άσκηση Μάγοι και πολεμιστές;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις Java με 26 έννοιες158 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.