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

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

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

Εισαγωγή

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

Στη C#, μια ιεραρχία κλάσεων μπορεί να οριστεί με κληρονομικότητα, η οποία επιτρέπει σε μια παράγωγη κλάση (Car) να κληρονομήσει τη συμπεριφορά και τα δεδομένα της γονικής της κλάσης (Vehicle). Αν δεν καθοριστεί γονική κλάση, η κλάση κληρονομεί από την κλάση object.

Οι γονικές κλάσεις μπορούν να παρέχουν λειτουργικότητα στις παράγωγες κλάσεις με τρεις τρόπους:

  • Ορίζοντας μια συνηθισμένη μέθοδο.
  • Ορίζοντας μια μέθοδο virtual, που είναι σαν μια συνηθισμένη μέθοδος, με τη διαφορά ότι οι παράγωγες κλάσεις μπορούν να την αλλάξουν.
  • Ορίζοντας μια μέθοδο abstract, που είναι μια μέθοδος χωρίς υλοποίηση την οποία οι παράγωγες κλάσεις πρέπει να υλοποιήσουν. Μια κλάση με μεθόδους abstract πρέπει να έχει και η ίδια τη σήμανση abstract. Οι αφηρημένες κλάσεις δεν μπορούν να δημιουργηθούν ως στιγμιότυπα.

Ο τροποποιητής πρόσβασης protected επιτρέπει την πρόσβαση σε ένα μέλος της γονικής κλάσης μέσα από μια παράγωγη κλάση, αλλά εμποδίζει την πρόσβαση από άλλες κλάσεις.

Οι παράγωγες κλάσεις μπορούν να έχουν πρόσβαση στα μέλη της γονικής κλάσης μέσω της λέξης-κλειδιού base.

// Inherits from the 'object' class
abstract class Vehicle
{
    // Can be overridden
    public virtual void Drive()
    {
    }

    // Must be overridden
    protected abstract int Speed();
}

class Car : Vehicle
{
    public override void Drive()
    {
        // Override virtual method

        // Call parent implementation
        base.Drive();
    }

    protected override int Speed()
    {
        // Implement abstract method
    }
}

Ο κατασκευαστής μιας παράγωγης κλάσης καλεί αυτόματα τον κατασκευαστή της γονικής κλάσης πριν εκτελέσει τη λογική του δικού του κατασκευαστή. Ορίσματα μπορούν να περαστούν στον κατασκευαστή μιας γονικής κλάσης χρησιμοποιώντας τη λέξη-κλειδί base:

abstract class Vehicle
{
    protected Vehicle(int wheels)
    {
        Console.WriteLine("Called first");
    }
}

class Car : Vehicle
{
    public Car() : base(4)
    {
        Console.WriteLine("Called second");
    }
}

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

abstract class Vehicle
{
   public abstract string GetDescription();
}

class Car : Vehicle
{
   public Car()
   {
   }

   public override string GetDescription()
   {
      return "Runabout";
   }
}

class Rig : Vehicle
{
   public Rig()
   {
   }

   public override string GetDescription()
   {
      return "Big Rig";
   }
}

Vehicle v1 = new Car();
Vehicle v2 = new Rig();

v1.GetDescription();
// => Runabout
v2.GetDescription();
// => Big Rig

Οδηγίες

Σε αυτή την άσκηση παίζεις ένα παιχνίδι ρόλων με το όνομα "Wizard and Warriors", στο οποίο μπορείς να παίξεις είτε ως Wizard είτε ως Warrior.

Υπάρχουν διαφορετικοί κανόνες για τους Warriors και τους Wizards που καθορίζουν πόσους πόντους ζημιάς προκαλούν.

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

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

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

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

Γενικά, οι χαρακτήρες δεν είναι ποτέ ευάλωτοι. Ωστόσο, οι Wizards είναι ευάλωτοι αν δεν έχουν προετοιμάσει ένα ξόρκι.

Έχεις έξι εργασίες που δουλεύουν με χαρακτήρες Warrior και Wizard.

1. Περιγράψε έναν χαρακτήρα

Κάνε override τη μέθοδο ToString() της κλάσης Character ώστε να επιστρέφει μια περιγραφή του χαρακτήρα, με τη μορφή "Character is a <CHARACTER_TYPE>".

var warrior = new Warrior();
warrior.ToString();
// => "Character is a Warrior"

2. Κάνε τους χαρακτήρες μη ευάλωτους από προεπιλογή

Βεβαιώσου ότι η μέθοδος Character.Vulnerable() επιστρέφει πάντα false.

var warrior = new Warrior();
warrior.Vulnerable();
// => false

3. Επίτρεψε στους Wizards να προετοιμάζουν ένα ξόρκι

Υλοποίησε τη μέθοδο Wizard.PrepareSpell() ώστε να επιτρέπει σε έναν Wizard να προετοιμάσει ένα ξόρκι εκ των προτέρων.

var wizard = new Wizard();
wizard.PrepareSpell();

4. Κάνε τους Wizards ευάλωτους όταν δεν έχουν προετοιμάσει ένα ξόρκι

Βεβαιώσου ότι η μέθοδος Vulnerable() επιστρέφει true αν ο wizard δεν έχει προετοιμάσει ένα ξόρκι, αλλιώς επιστρέφει false.

var wizard = new Wizard();
wizard.Vulnerable();
// => true

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

Υλοποίησε τη μέθοδο Wizard.DamagePoints() ώστε να επιστρέφει τους πόντους ζημιάς που προκαλούνται: 12 πόντους ζημιάς όταν έχει προετοιμαστεί ένα ξόρκι, 3 πόντους ζημιάς όταν όχι.

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

wizard.PrepareSpell();
wizard.DamagePoints(warrior);
// => 12

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

Υλοποίησε τη μέθοδο Warrior.DamagePoints() ώστε να επιστρέφει τους πόντους ζημιάς που προκαλούνται: 10 πόντους ζημιάς όταν ο στόχος είναι ευάλωτος, 6 πόντους ζημιάς όταν όχι.

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

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

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

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