Sobes.tech
Middle

Ποια είναι η διαφορά μεταξύ υπερχείλισης και απόκρυψης μεθόδων σε C#;

sobes.tech AI

Απάντηση από AI

Η υπερισχύρηση (override) χρησιμοποιείται για την υλοποίηση πολυμορφισμού, επιτρέποντας στην κλάση-υιός να παρέχει τη δική της υλοποίηση μιας εικονικής, αφηρημένης ή κληρονομημένης μεθόδου. Η λέξη-κλειδί virtual στην βασική κλάση και override στην κλάση-υιό είναι υποχρεωτικά.

Το κρύψιμο (hiding, shadowing) γίνεται με μια μέθοδο με το ίδιο όνομα στην κλάση-υιό που κρύβει τη μέθοδο της βασικής κλάσης. Η μέθοδος της βασικής κλάσης διατηρείται, αλλά η πρόσβαση σε αυτή από ένα στιγμιότυπο της κλάσης-υιού γίνεται μέσω ρητού μετασχηματισμού τύπου ή της λέξης-κλειδί base. Χρησιμοποιείται η λέξη-κλειδί new στην κλάση-υιό.

Χαρακτηριστικό Υπερισχύρηση (Override) Κρύψιμο (Hiding)
Λέξη-κλειδί virtual (βασική), override (υιός) new (υιός)
Πολυμορφισμός Ναι, καλείται η υλοποίηση της κλάσης-υιού Όχι, καλείται η υλοποίηση ανάλογα με τον τύπο της αναφοράς
Κλήση μέσω αναφοράς τύπου βάσης Καλείται η υπερισχύουσα μέθοδος της κλάσης-υιού Καλείται η μέθοδος της βασικής κλάσης
Πρόσβαση στη μέθοδο της βασικής κλάσης Μέσω base.MethodName() Μέσω base.MethodName() ή μετατροπή τύπου
public class BaseClass
{
    public virtual void ShowMessage() // Εικονική μέθοδος για υπερισχύρηση
    {
        Console.WriteLine("Μήνυμα από BaseClass (εικονική).");
    }

    public void DisplayInfo() // Μέθοδος για κρύψιμο
    {
        Console.WriteLine("Πληροφορίες από BaseClass.");
    }
}

public class DerivedClass : BaseClass
{
    public override void ShowMessage() // Υπερισχύρηση της εικονικής μεθόδου
    {
        Console.WriteLine("Μήνυμα από DerivedClass (override)." );
    }

    public new void DisplayInfo() // Κρύψιμο της μεθόδου
    {
        Console.WriteLine("Πληροφορίες από DerivedClass (new)." );
    }
}

public class Program
{
    public static void Main(string[] args)
    {
        BaseClass baseObj = new BaseClass();
        DerivedClass derivedObj = new DerivedClass();
        BaseClass derivedAsBase = new DerivedClass(); // Αναφορά βασικού τύπου σε αντικείμενο υιού

        baseObj.ShowMessage();     // Έξοδος: Μήνυμα από BaseClass (εικονική).
        baseObj.DisplayInfo();     // Έξοδος: Πληροφορίες από BaseClass.

        derivedObj.ShowMessage();  // Έξοδος: Μήνυμα από DerivedClass (override).
        derivedObj.DisplayInfo();  // Έξοδος: Πληροφορίες από DerivedClass (new).

        derivedAsBase.ShowMessage(); // Έξοδος: Μήνυμα από DerivedClass (override). (Πολυμορφισμός σε δράση)
        derivedAsBase.DisplayInfo(); // Έξοδος: Πληροφορίες από BaseClass. (Η μέθοδος της βασικής κλάσης καλείται λόγω του τύπου αναφοράς)
    }
}