opublikował: mariusz, 2014-01-05

C# metody wirtualne i abstrakcyjne

Metody wirtualne

Virtual – tym słowem kluczowym w języku C# możemy zadeklarować daną  metodę jako wirtualną, oznacza to, że dana metoda może zostać nadpisana w klasie która dziedziczy po klasie w której jest ta metoda zdefiniowana. Może ale nie musi, jeżeli zechcemy nadpisać daną metodę używamy kolejnego słowa

kluczowego – override. Oto przykład klasy która ma w sobie metodę wirtualną:

 

         class MamMetodeVirtualna

             {

                 public virtual void DajGlos()

                 {

                     Console.WriteLine("Dźwięk zwierzęcia");

                 }

             }

 

A to klasa która dziedziczy po  wyżej wymienionej klasie i nadpisuje metodę wirtualną:

 

         class Kot : MamMetodeVirtualna
             {
                 public override void DajGlos()
                 {
                     Console.WriteLine("Miaaał");
                 }
             }
 

Gdyby klasa Kot nie nadpisała tej metody i chcielibyśmy wywołać tą metodę na instancji klasy Kot to wywołała by się metoda z klasy bazowej i wypisałaby nam w konsoli „Dźwięk zwierzęcia”. Ciekawostką jest to, że jeżeli utworzymy jakąkolwiek nową klasę, to ona już może nadpisać trzy metody:

override Equals(object){...}

override GetHashCode(){...}
 
override ToString(){...}

 

 

Dzieje się tak dlatego, że każda klasa dziedziczy po klasie Object. Klasa Object ma właśnie te trzy metody wirtualne.

 

Metody abstrakcyjne

Z kolei słowem kluczowym abstract deklarujemy, że dana metoda będzie abstrakcyjna. Te metody znaczne się różnią od metod wirtualnych. Metoda abstrakcyjna nie ma ciała, to znaczy, że klasa która dziedziczy po klasie abstrakcyjnej, musi zapewnić ciało dla metody abstrakcyjnej. Kolejną różnicą jest to, że jeżeli jakaś klasa posiada metodę abstrakcyjną sama musi się stać klasą abstrakcyjną, następstwem tego jest to, że nie można utworzyć instancji klasy abstrakcyjnej, co jest oczywiste przecież jak można utworzyć instancję klasy która ma w sobie metodę bez ciała. Oto przykład klasy abstrakcyjnej:

 

         abstract class AbstractClass
        {
            public abstract void DajGlos();
            public void MetodaNieAbstrakcyjna()
            {
                Console.WriteLine("Wywołałeś metodę nie abstrakcyjną");
            }
            public virtual void MedodaWirtualna()
            {
                Console.WriteLine("Metoda wirtualna  z klasy abstrakcyjnej");
            }
        }

 

Jak widzimy w tej klasie abstrakcyjnej mamy trzy metody. Pierwsza metoda DajGlos jest metodą abstrakcyjną i nie może posiadać ciała, klasa dziedzicząca jej zapewni ciało. Druga metoda MetodaNieAbstrakcyjna nie jest ani wirtualna ani abstrakcyjna więc klasa dziedzicząca nie może jej nadpisać, ostatnią metodą jest MetodaWirtualna, klasa dziedzicząca może ją nadpisać lub pozostawić jej obecną formę.

 

Zaloguj się aby dodać komentarz