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. (Η μέθοδος της βασικής κλάσης καλείται λόγω του τύπου αναφοράς)
}
}