Jason. Cała informatyka w jednym miejscu!

Mamy nowy temat języka C# do zbadania i skomentowania! Temat jaki chcę Wam zobrazować będzie luźną kontynuacją do słowa kluczowego "this", ale tylko w części odniesienia do swojej klasy. "base" w języku C# to także odniesienie, ale...do swojego rodzica :)! Detale opisuję w środku!

"BASE" W JĘZYKU C# CHOĆ MA KILKA ZNACZEŃ, SPROWADZA SIĘ DO TEGO SAMEGO

Z której strony na to nie popatrzymy i w jakim kontekście nie skorzystamy, chodzi o przedostanie się referencją do klasy bazowej przez klasę potomną. Po to jest to "base", tak w dwóch słowach. A teraz poszerzę tę myśl.

WYWOŁYWANIE KONSTRUKTORA KLASY BAZOWEJ

"base" przede wszystkim możemy użyć do skorzystania z konstruktora klasy bazowej. Często jest tak podczas dziedziczenia, że z oczywistych względów nie chcemy zachowywać się po amatorsku i powielać raz napisany ciąg instrukcji, który i tak ma dotyczyć klasy potomnej, i tak. Albo chcemy poszerzyć paletę możliwości utworzenia instancji na parę sposobów, przeciążyć konstruktor i część danych wstawić domyślnych, a część zostawić jako parametry formalne. Dlatego też sugestia nakazuje skorzystać z konstruktora klasy bazowej, więc skorzystamy z "base" w języku C# następująco:

KLASA "MYBASECLASS"
public class MyBaseClass
{
	private int x;
	
	public MyBaseClass(int x)
	{
		this.x = x;
	}
}
KLASA "MYCHILDCLASS"
public class MyChildClass : MyBaseClass
{
	public MyChildClass(int x):base(x)
	{
		
	}
}

Od teraz, gdy utworzymy instancję klasy potomnej, konstruktor "zwróci się" do konstruktora klasy bazowej zgodnego z podaną listą parametrów (nawet jeśli pustą), jeśli ona istnieje. W ten sposób wszystko się pięknie zazębia, jest spójne, czytelne i sensowne. Ekstra :D!

Słowo kluczowe "base" w języku C# jako wywołanie konstruktora klasy bazowej

"base" w języku C# to między innymi wywołanie konstruktora klasy bazowej z konstruktora klasy potomnej.

WYWOŁYWANIE METODY KLASY BAZOWEJ

Drugi punkt odnosi się do tego samego, natomiast teraz przyjrzymy się metodom poddanym przesłanianiu (o tym będzie osobny artykuł). Bywa, że chcemy wywołać pierwotną "wersję" metody, która została poddana przesłonięciu, obojętnie w jaki sposób (w C# można to wykonać więcej niż jedną drogą). Załóżmy, że klasa potomna posiada własną wersję metody istniejącej w klasie bazowej i że mamy ochotę rozszerzyć jej działanie zachowując poprzednie polecenia wykonywane jako pierwsze. Załóżmy też, że postępujemy metodą przesłaniania poprzez słowo kluczowe "override". To wówczas możemy ponownie sięgnąć po "base" i dosłownie odnieść się do klasy bazowej będącej "rodzicem". Przez "base" w języku C# możemy swobodnie przedostać się do danych składowychmetod (o ile są publiczne lub chronione) za pomocą kropki, aby w końcu (w tym przypadku) wywołać metodę o tej samej nazwie:

KLASA "MYBASECLASS"
using System;

public class MyBaseClass
{
	protected virtual void DoSomething()
	{
		Console.WriteLine("Wykonuję polecenia klasy bazowej.");
	}
}
KLASA "MYCHILDCLASS"
using System;

public class MyChildClass : MyBaseClass
{
	protected override void DoSomething()
	{
		base.DoSomething();
		Console.WriteLine("Wykonuję polecenia klasy potomnej.");
	}
}

Przyjrzyjcie się koniecznie nagłówkowi metody przesłanianej! Żeby rozszerzanie funkcjonalności doszło do skutku, język C# wymaga skorzystania z pary słów kluczowych "virtual" i "override". "virtual" umieszcza się w nagłówku metody po modyfikatorze dostępu w klasie bazowej, a "override", w tym samym miejscu w klasie potomnej. To jest jedna z dróg aby skutecznie przesłonić metodę zachowując możliwości wywołania jej pierwotnej wersji.

A teraz, deser na deser :D. W języku Java funkcjonuje taki sam mechanizm, tylko ze zmienionym słówkiem: "super". Javowcy, pamiętacie ;)?

KLASA "MYBASECLASS"
public class MyBaseClass {
	public void DoSomething() {
		System.out.println("Wykonuję polecenia klasy bazowej.");
	}
}
KLASA "MYCHILDCLASS"
public class MyChildClass extends MyBaseClass {
	@Override
	public void DoSomething() {
		super.DoSomething();
		System.out.println("Wykonuję polecenia klasy potomnej.");
	}
}

No. To "base" w języku C# daje dokładnie ten sam efekt. Może nie brzmi tak "super" jak w Javie :D, jednak daje taki sam rezultat.

Słowo kluczowe "base" w języku C# jako wywołanie metody klasy bazowej

Wywoływanie "bazowej" wersji dowolnej z metod o chronionym lub publicznym dostępie - oto drugie wcielenie "base" w języku C#.


Wspólnie zakończyliśmy omawianie następnego wątku. Co prawda możecie się poczuć lekko skrzywdzeni z powodu wymaganej wiedzy o przesłanianiu (bez niej będzie zrozumiała tylko połowa treści), natomiast po to dla Was piszę i po to się kształcę, żeby przynosić odpowiedź dla wszystkich zainteresowanych (nawet jeśli spóźniłem się o ponad 20 lat :P).

PODOBNE ARTYKUŁY