Στη 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, οι κανόνες είναι οι εξής:
Για έναν Wizard, οι κανόνες είναι οι εξής:
Γενικά, οι χαρακτήρες δεν είναι ποτέ ευάλωτοι. Ωστόσο, οι Wizards είναι ευάλωτοι αν δεν έχουν προετοιμάσει ένα ξόρκι.
Έχεις έξι εργασίες που δουλεύουν με χαρακτήρες Warrior και Wizard.
Κάνε override τη μέθοδο ToString() της κλάσης Character ώστε να επιστρέφει μια περιγραφή του χαρακτήρα, με τη μορφή "Character is a <CHARACTER_TYPE>".
var warrior = new Warrior();
warrior.ToString();
// => "Character is a Warrior"
Βεβαιώσου ότι η μέθοδος Character.Vulnerable() επιστρέφει πάντα false.
var warrior = new Warrior();
warrior.Vulnerable();
// => false
Υλοποίησε τη μέθοδο Wizard.PrepareSpell() ώστε να επιτρέπει σε έναν Wizard να προετοιμάσει ένα ξόρκι εκ των προτέρων.
var wizard = new Wizard();
wizard.PrepareSpell();
Βεβαιώσου ότι η μέθοδος Vulnerable() επιστρέφει true αν ο wizard δεν έχει προετοιμάσει ένα ξόρκι, αλλιώς επιστρέφει false.
var wizard = new Wizard();
wizard.Vulnerable();
// => true
Υλοποίησε τη μέθοδο Wizard.DamagePoints() ώστε να επιστρέφει τους πόντους ζημιάς που προκαλούνται: 12 πόντους ζημιάς όταν έχει προετοιμαστεί ένα ξόρκι, 3 πόντους ζημιάς όταν όχι.
var wizard = new Wizard();
var warrior = new Warrior();
wizard.PrepareSpell();
wizard.DamagePoints(warrior);
// => 12
Υλοποίησε τη μέθοδο Warrior.DamagePoints() ώστε να επιστρέφει τους πόντους ζημιάς που προκαλούνται: 10 πόντους ζημιάς όταν ο στόχος είναι ευάλωτος, 6 πόντους ζημιάς όταν όχι.
var warrior = new Warrior();
var wizard = new Wizard();
warrior.DamagePoints(wizard);
// => 10
Γράψου στο Exercism για να μάθεις και να κατακτήσεις C# με 62 έννοιες178 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.