5.9 Αφαίρεση (Abstraction) στη γλώσσα C#

Η αφαίρεση (abstraction) είναι ένα σημαντικό έννοια στη γλώσσα C#, η οποία επιτρέπει την κατασκευή και χρήση αφηρημένων κλάσεων και αντικειμένων.

Στην C#, η αφαίρεση μας επιτρέπει να αποκρύψουμε τις λεπτομέρειες υλοποίησης ενός αντικειμένου και να επικεντρωθούμε στις βασικές του χαρακτηριστικά και λειτουργίες. Αυτό γίνεται μέσω της δημιουργίας αφηρημένων κλάσεων, που ορίζουν μια γενική δομή και συμπεριφορά για έναν τύπο αντικειμένου, χωρίς να αποκαλύπτουν τις λεπτομέρειες υλοποίησής τους.

Για παράδειγμα, μπορούμε να δημιουργήσουμε μια αφηρημένη κλάση με το όνομα “Shape” που θα παριστάνει γεωμετρικά σχήματα. Η κλάση “Shape” μπορεί να έχει μια μέθοδο “CalculateArea()” που θα υπολογίζει την περιοχή του σχήματος. Στη συνέχεια, μπορούμε να δημιουργήσουμε υποκλάσεις, όπως “Rectangle” και “Circle”, που θα κληρονομούν την αφηρημένη κλάση “Shape” και θα υλοποιούν τη μέθοδο “CalculateArea()” για κάθε συγκεκριμένο σχήμα.

Η αφαίρεση μας επιτρέπε

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

Μια αφαιρετική κλάση μπορεί να έχει τόσο αφαιρετικές όσο και κανονικές μεθόδους:

abstract class Animal
{
    // Αφαιρετική μέθοδος
    public abstract void Sound();

    // Κανονική μέθοδος
    public void Sleep()
    {
        Console.WriteLine("The animal is sleeping");
    }
}

Στο παραπάνω παράδειγμα, έχουμε μια αφαιρετική κλάση Animal που περιλαμβάνει μια αφαιρετική μέθοδο Sound() και μια κανονική μέθοδο Sleep(). Η αφαιρετική μέθοδος Sound() δεν έχει σώμα και ορίζεται με την λέξη-κλειδί abstract. Η κανονική μέθοδος Sleep() έχει σώμα και μπορεί να χρησιμοποιηθεί ως έχει.

Η αφαιρετική μέθοδος Sound() πρέπει να υπερκαλύπτεται (override) από τις παράγωγες κλάσεις που κληρονομούν από την κλάση Animal.

Από το παραπάνω παράδειγμα, δεν είναι δυνατό να δημιουργήσετε ένα αντικείμενο της κλάσης Animal, καθώς είναι μια αφαιρετική κλάση. Ο σκοπός της αφαιρετικής κλάσης είναι να λειτουργήσει ως βασική κλάση για άλλες κλάσεις που θα κληρονομήσουν από αυτήν.

Για παράδειγμα, ας δημιουργήσουμε μια παράγωγη κλάση Dog που κληρονομεί από την κλάση Animal:

class Dog : Animal
{
    public override void Sound()
    {
        Console.WriteLine("The dog barks");
    }
}

Στο παραπάνω παράδειγμα, η κλάση Dog κληρονομεί από την κλάση Animal και υπερκαλύπτει (override) τη μέθοδο Sound() με τον δικό της ήχο για το σκυλί.

Τώρα, μπορούμε να δημιουργήσουμε ένα αντικείμενο της κλάσης Dog και να καλέσουμε τη μέθοδο Sound():

Dog myDog = new Dog();
myDog.Sound(); // Εκτυπώνει "The dog barks"

Σε αυτό το παράδειγμα, μπορούμε να δημιουργήσουμε ένα αντικείμενο της κλάσης Dog, αλλά δεν μπορούμε να δημιουργήσουμε ένα αντικείμενο της κλάσης Animal απευθείας, καθώς είναι αφαιρετική και χρειάζεται να χρησιμοποιηθεί μέσω της παράγωγης κλάσης Dog.

[adinserter block=”2″]

Για να έχουμε πρόσβαση στην αφαιρετική κλάση, πρέπει να κληρονομήσουμε από μια άλλη κλάση. Ας μετατρέψουμε την κλάση Animal που χρησιμοποιήσαμε στο κεφάλαιο του Πολυμορφισμού σε μια αφαιρετική κλάση.

using System;

// Αφηρημένη κλάση Animal
abstract class Animal
{
    public abstract void AnimalSound(); // Αφηρημένη μέθοδος για τον ήχο του ζώου
}

// Κλάση Pig που κληρονομεί την κλάση Animal
class Pig : Animal
{
    public override void AnimalSound()
    {
        Console.WriteLine("The pig says: Oink oink!"); // Εκτύπωση ήχου χοίρου
    }
}

// Κλάση Cat που κληρονομεί την κλάση Animal
class Cat : Animal
{
    public override void AnimalSound()
    {
        Console.WriteLine("The cat says: Meow!"); // Εκτύπωση ήχου γάτας
    }
}

// Κλάση Dog που κληρονομεί την κλάση Animal
class Dog : Animal
{
    public override void AnimalSound()
    {
        Console.WriteLine("The dog says: Woof woof!"); // Εκτύπωση ήχου σκύλου
    }
}

// Κλάση Bird που κληρονομεί την κλάση Animal
class Bird : Animal
{
    public override void AnimalSound()
    {
        Console.WriteLine("The bird says: Chirp chirp!"); // Εκτύπωση ήχου πουλιού
    }
}

Στο παραπάνω παράδειγμα, μετατρέψαμε την κλάση Animal σε μια αφαιρετική κλάση με τη χρήση της λέξης-κλειδί abstract. Η αφαιρετική μέθοδος AnimalSound() δεν έχει σώμα και ορίζεται επίσης με τη λέξη-κλειδί abstract. Οι παράγωγες κλάσεις Pig, Cat, Dog και Bird κληρονομούν από την κλάση Animal και υπερκαλύπτουν (override) τη μέθοδο AnimalSound() με τις δικές τους υλοποιήσεις.

Τώρα μπορούμε να δημιουργήσουμε αντικείμενα από τις παράγωγες κλάσεις και να καλέσουμε τη μέθοδο AnimalSound():

Animal myPig = new Pig();
Animal myCat = new Cat();
Animal myDog = new Dog();
Animal myBird = new Bird();

myPig.AnimalSound(); // Εκτυπώνει "The pig says: Oink oink!"
myCat.AnimalSound(); // Εκτυπώνει "The cat says: Meow!"
myDog.AnimalSound(); // Εκτυπώνει "

The dog says: Woof woof!"
myBird.AnimalSound(); // Εκτυπώνει "The bird says: Chirp chirp!"

Σε αυτό το παράδειγμα, δημιουργούμε αντικείμενα από τις παράγωγες κλάσεις (Pig, Cat, Dog, Bird) αλλά τα αποθηκεύουμε σε μεταβλητές τύπου Animal. Καλούμε τη μέθοδο AnimalSound() σε κάθε ένα από αυτά τα αντικείμενα και εκτελείται η υλοποίηση που έχουμε ορίσει σε κάθε παράγωγη κλάση, ανάλογα με τον τύπο του ζώου.

21 Αυγούστου, 2023
top
error: Content is protected !!
Μετάβαση σε γραμμή εργαλείων