Jason. Cała informatyka w jednym miejscu!

Tęskniliście za obiektowością w "CSharpie"? To mam dla Was kolejną część poznawania zasad jak się obchodzić z klasami. Dowiecie się z tego artykułu jak powstaje dziedziczenie w języku C#, a zatem poznacie pojęcie i znaczenie klasy potomnej. Proszę do środka!

DZIEDZICZENIE W JĘZYKU C# NIE ODSTAJE NICZYM OD WIĘKSZOŚCI INNYCH JĘZYKÓW

Jeśli znacie jakiś inny język wysokiego poziomu, w którym programowaliście dziedziczenie np. Java, to macie ułatwione zadanie :). Co prawda, to zależy jaki język, bo każdy z nich różni się innym stopniem wspieranego paradygmatu obiektowego (np. Java ma o wiele więcej wspólnego z obiektowością niż Python), natomiast zasada ogólna jest taka sama. Tworzymy sobie klasę:

class MyBaseClass
{
	
}

potem drugą klasę i zaznaczamy, że chcemy aby ona od niej dziedziczyła:

class MyChildClass : MyBaseClass
{
	
}

Widzicie już to oznaczenie? Być może spodziewaliście się nowego słowa kluczowego, jednak na dziedziczenie w języku C# nie przeznaczono żadnej osobnej frazy. Po prostu po nazwie wstawiacie dwukropek, następnie podajecie bezbłędnie nazwę klasy bazowej (albo interfejsu) i to wszystko! Czy to koniec, zależy jeszcze od wymagań odziedziczonej klasy bądź implementowanego interfejsu (myślę o abstrakcji), natomiast w prostych przypadkach na tym kończy się nasza interwencja :). W taki oto sposób klasa potomna dziedziczy od klasy bazowej (tak się prawidłowo mówi).

A KOMU TO POTRZEBNE?

Dziedziczenie w języku C# stanowi jeden z najważniejszych postulatów programowania obiektowego. Określa on możliwość "przejmowania" przez klasę potomną wszystkich danych składowych i metod klasy bazowej, w zależności od ich modyfikatora dostępu. Celem głównym stosowania dziedziczenia jest jak sprawienie, żeby jak największa część całego kodu dotyczącego hierarchii klas była użyteczna dla wszystkich, bez żadnego powielania tego samego bloku instrukcji.

To nie koniec benefitów płynących z dziedziczenia. Nakłada on także obowiązek trzymania się ustalonego "protokołu" dla kolejnych klas potomnych, które mogą powstać w przyszłości. Mam na myśli przede wszystkim efektywne wymuszanie implementacji metod abstrakcyjnych. Kompilator za Chiny nie puści Was dalej, dopóki nie spełnicie wszystkich warunków jakie narzuca hierarchia dziedziczenia.

CO NAM DAJE DZIEDZICZENIE?

Po teoretycznym wyjaśnieniu po co to zostało skonstruowane, kontynuujemy demonstrację kodów źródłowych, bo nauka programowania powinna się zawsze kręcić wokół nich. Dziedziczenie w języku C# "przenosi" wszystkie dane składowe i metody o dostępie publicznym lub chronionym na klasę potomną. Proszę o zerknięcie poniżej. Mając klasę którą chcemy uczynić bazową:

class MyBaseClass
{
	public int a;
	private int b;
	protected int c;
}

jak myślicie, co "dostanie" klasa potomna po oświadczeniu, że ma taką być?

class MyChildClass : MyBaseClass
{
	???
}

Klasa potomna otrzyma daną składową "a" i "c". "b" jest prywatne, więc dostęp zostanie przyznany jedynie klasie bazowej. Metody dotyczy to samo. Modyfikatory dostępu decydują o tym, jak "daleko" zawartość będzie widoczna na zewnątrz klasy bazowej. Publiczny dostęp (public) sprawi, że będzie to widoczne dla wszystkich. Chroniony (protected) udostępni zawartość tylko klasom potomnym. Tak to działa!

CO SIĘ DZIEJE PODCZAS TWORZENIA OBIEKTU KLASY POTOMNEJ?

Należą Wam się jeszcze wyjaśnienia odnośnie tego, jakie cuda wianki występują gdy tworzy się obiekt typu klasa potomna. Kiedy program dojdzie do poniższej instrukcji:

Entity entity = new Entity(6, 9, "box");

zakładając że klasa "Entity" jest klasą potomną, to zostanie wywołany nie jeden, a dwa konstruktory :O! Jak to możliwe? To proste!

Żeby zbudować dom, trzeba postawić fundamenty. Tu jest taka sama zasada. Żeby móc utworzyć w pełni funkcjonalną instancję klasy potomnej, trzeba najpierw utworzyć instancję klasy bazowej. Dlatego też w pierwszej kolejności, klasa potomna "odezwie się" do swojego rodzica (zostanie wywołany konstruktor klasy bazowej), a dopiero potem do akcji wkroczy sama klasa potomna, czyli dojdzie do wykonania konstruktora tej klasy. Dziedziczenie w języku C# tak właśnie funkcjonuje. Wklejcie sobie ten kod i uruchomcie, jeśli nie wierzycie mi na słowo :P:

KLASA BAZOWA
using System;

public class MyBaseClass
{
	public MyBaseClass()
	{
		Console.WriteLine("Konstruktor klasy bazowej.");
	}
}
KLASA POTOMNA
using System;

public class MyChildClass : MyBaseClass
{
	public MyChildClass()
	{
		Console.WriteLine("Konstruktor klasy potomnej.");
	}
}
KLASA URUCHOMIENIOWA
class Program
{
	static void Main(string[] args)
	{
		MyChildClass mcc = new MyChildClass();
	}
}

DZIEDZICZENIE OD WIELU KLAS W JĘZYKU C#? ZAPOMNIJ!

Jeszcze jedna rzecz na dokładkę. W języku C# zabrania się wielokrotnego dziedziczenia! Także miłośnicy języka C++ muszą się pożegnać z taką funkcjonalnością i obejść się smakiem. Głowicie się czemu to zostało zabronione? To przez "problem śmiertelnego rombu". Opisywałem go szczegółowo w osobnym artykule, więc od razu skieruję Was bezpośrednio do niego, aby nie mieszać obu różnych tematów w jednym miejscu.

Dziedziczenie w języku C#

Dziedziczenie w języku C# to nawiązanie "więzi" z drugą klasą, która zapobiega nadmiarowości kodu poprzez "przenoszenie" wszystkich pól i metod o dostępie publicznym lub chronionym, na klasę która dziedziczy. "Rodzicem" określa się klasę "bazową", a "potomkiem" staje się klasa "potomna".


Sporo tego, prawda :D? Bądźcie spokojni. Kiedy poćwiczycie przy kilkudziesięciu zadaniach wymagających programowania klas potomnych, wtedy zejdzie to do stopnia "bardzo proste".

PODOBNE ARTYKUŁY