Dziedziczenie w programowaniu obiektowym

Dziedziczenie - rozszerzanie możliwości klas.


Dziedziczenie pozwala rozszerzać możliwości klas poprzez implementacje osobnych klas rozszerzających. Klasa po której dziedziczą inne klasy jest klasą bazową, klasy które dziedziczą po klasie bazowej noszą nazwę klas pochodnych. Dzięki dziedziczeniu możemy tworzyć nowe klasy w oparciu o już istniejące, bez potrzeby implementowania tych funkcjonalności, które zostały już zaimplementowane w klasach bazowych. Klasy potomne nie mogą być bardziej dostępne od klasy bazowej. Dziedziczyć możemy tylko po jednej klasie bazowej oraz po wielu interfejsach. Nazwę klasy i interfejsów, po których dziedziczymy zapisujemy po znaku dwukropka w miejscu definicji nowej klasy.

Przykład:

public class KlasaDziedziczaca : KlasaBazowa, IBazoweInterfejsy
{
}

Dostęp do składowych klas bazowych:

  • składowe public (publiczne) są także publiczne dla klasy potomnej,
  • składowe protected (chronione) są dostępne dla klasy potomnej,
  • składowe private (prywatne) nie są bezpośrednio dostępne dla klasy potomnej, można jednak zmieniać ich wartość za pomocą publicznych metod lub właściwości które zostaną opisane w kolejnym podrozdziale.

Przesłanianie metod (polimorfizm)

Przesłanianie metod pozwala na zamianę definicji metody z klasy bazowej na tę znajdująca się klasie pochodnej, dzieje się to w czasie wywołania metody dla klasy pochodnej.

Metody wirtualne:

  • metody przesłaniane (wirtualne) poprzedzamy modyfikatorem virtual,
  • metody wirtualne muszą zawierać ciało (może być to ciało puste czyli metoda nic nie robi, ale zawiera nawiasy klamrowe - pusty blok instrukcji),
  • nie mogą być statyczne,
  • nie mogą być prywatne.

Więcej na temat dziedziczenia:

http://msdn.microsoft.com/pl-pl/library/ms173149.aspx

Metody przesłaniające:

  • poprzedzamy modyfikatorem override,
  • stają się automatycznie metodami wirtualnymi, przez co mogą być przesłonięte w klasie potomnej,
  • muszą zawierać ciało (może być to ciało puste, czyli metoda nic nie robi, ale zawiera nawiasy klamrowe - pusty blok instrukcji),
  • muszą mieć składnie identyczną jak składnia metody wirtualnej z klasy bazowej (nie można np. dodawać dodatkowych parametrów),
  • nie mogą być statyczne,
  • nie mogą być prywatne.

Ukrywanie metod

Ukrycie metody polega na zastąpieniu metody o tej samej nazwie z klasy bazowej zupełnie inną metodą w klasie pochodnej. Aby ukryć metodę stosujemy słowo kluczowe new. Metoda ukrywająca może zwracać inny typ wartości niż metoda ukryta, ponieważ ten parametr nie jest brany pod uwagę w szacowaniu identyczności metody. Ukrywanie metod możemy stosować zarówno do metod wirtualnych jak i niewirtualnych. W przypadku stosowania mechanizmu ukrywania dla metod wirtualnych, stają się one metodami nr 1 w łańcuchu dziedziczenia.

Wywoływanie konstruktorów

Domyślnym konstruktorem wywoływanym w czasie wywołania konstruktora dla klasy potomnej jest bezparametrowy konstruktor klasy bazowej. Aby zamiast bezparametrowego konstruktora wywołać inny konstruktor z parametrami używamy słowa kluczowego base. Dopiero po wywołaniu konstruktora klasy bazowej następuje wywołanie konstruktora z klasy potomnej. Słowo kluczowe base używamy również do odwołania się do składowych klasy bazowej (w przypadku gdy pokrywają się nazwy pól).

Przykładowy kod korzystający ze słowa kluczowego base:

    public class FullContext : DbContext
    {
        public FullContext()
            : base("DefaultConnection")
        {
        }
 
        public DbSet<Kurs> Kursy { get; set; }
    }
Komentarze facebook (polub nasz profil na FB aby je zobaczyć):