Customize Consent Preferences

We use cookies to help you navigate efficiently and perform certain functions. You will find detailed information about all cookies under each consent category below.

The cookies that are categorized as "Necessary" are stored on your browser as they are essential for enabling the basic functionalities of the site. ... 

Always Active

Necessary cookies are required to enable the basic features of this site, such as providing secure log-in or adjusting your consent preferences. These cookies do not store any personally identifiable data.

No cookies to display.

Functional cookies help perform certain functionalities like sharing the content of the website on social media platforms, collecting feedback, and other third-party features.

No cookies to display.

Analytical cookies are used to understand how visitors interact with the website. These cookies help provide information on metrics such as the number of visitors, bounce rate, traffic source, etc.

No cookies to display.

Performance cookies are used to understand and analyze the key performance indexes of the website which helps in delivering a better user experience for the visitors.

No cookies to display.

Advertisement cookies are used to provide visitors with customized advertisements based on the pages you visited previously and to analyze the effectiveness of the ad campaigns.

No cookies to display.

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

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

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

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

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

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

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
abstract class Animal
{
// Αφαιρετική μέθοδος
public abstract void Sound();
// Κανονική μέθοδος
public void Sleep()
{
Console.WriteLine("The animal is sleeping");
}
}
abstract class Animal { // Αφαιρετική μέθοδος public abstract void Sound(); // Κανονική μέθοδος public void Sleep() { Console.WriteLine("The animal is sleeping"); } }
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:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
class Dog : Animal
{
public override void Sound()
{
Console.WriteLine("The dog barks");
}
}
class Dog : Animal { public override void Sound() { Console.WriteLine("The dog barks"); } }
class Dog : Animal
{
    public override void Sound()
    {
        Console.WriteLine("The dog barks");
    }
}

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

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
Dog myDog = new Dog();
myDog.Sound(); // Εκτυπώνει "The dog barks"
Dog myDog = new Dog(); myDog.Sound(); // Εκτυπώνει "The dog barks"
Dog myDog = new Dog();
myDog.Sound(); // Εκτυπώνει "The dog barks"

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

[adinserter block=”2″]

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

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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!"); // Εκτύπωση ήχου πουλιού
}
}
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!"); // Εκτύπωση ήχου πουλιού } }
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():

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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!"
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!"
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 !!
Μετάβαση σε γραμμή εργαλείων