Jason. Cała informatyka w jednym miejscu!

Klasa abstrakcyjna to kolejny "puzzel" układanki, nad którą siedzi każdy, kto chce nauczyć się podstaw programowania. Nie powinno być dla wielu osób zdziwieniem, że dotyczy to jeszcze jednego rodzaju klasy jaką mamy prawo zdefiniować. Nie jest to żadna bzdura, na którą można machnąć ręką i iść dalej. A zatem drodzy Państwo, oto słowo kluczowe "abstract" w języku C# i tłumaczenie na co nam właściwie ta abstrakcja!

"ABSTRACT" W JĘZYKU C# ODSŁANIA JEDEN Z FILARÓW PROGRAMOWANIA OBIEKTOWEGO

Dotykamy ważnego postulatu obowiązującego w paradygmacie obiektowym jakim jest abstrakcja. Abstrakcja czyli dysponowanie "szkieletem" bądź szablonem klasy, który będzie mógł być dostosowywany do wszelkich niestandardowych potrzeb klas potomnych. Co więcej, ta implementacja będzie wymuszana przez bycie składową abstrakcyjną. Wszystko co jest abstrakcyjne, W KAŻDEJ klasie potomnej MUSI być jasno zdefiniowane (chyba, że klasa potomna także jest abstrakcyjna). Zasada mówi również o jeszcze jednej rzeczy - taki "szkielet" nie może być wykorzystywany jako obiekt, czyli wszelkie próby tworzenia zbyt ogólnej postaci obiektu będą nieakceptowalne przez program i spowodują błąd kompilacji.

GENIUSZ TKWI W ABSTRAKCJI

Tyle samej teorii, a teraz możemy przejść do zadań praktycznych. W C# abstrakcyjna może być klasa, ale też metoda i właściwość. Wszystko to, co ma być abstrakcyjne, definiuje się przy pomocy słowa kluczowego "abstract" w języku C#. Popatrzmy na każdy przypadek.

KLASA ABSTRAKCYJNA

Abstrakcyjna może być przede wszystkim klasa. Definiujemy ją przy użyciu poznanej składni tak jak zwykle, dopisując jedynie jedno dodatkowe słowo przed frazą "class", "abstract":

abstract class MyAbstractClass
{
	
}

To będzie oznaczać dwie rzeczy. Po pierwsze, tworzenie instancji na bazie tej klasy jest od tej chwili zabronione. Po drugie, nakłada to "jednostronny" warunek występowania tego słowa kluczowego. "abstract" w języku C# będzie musiało tam stać, jeśli posiada w sobie cokolwiek abstrakcyjnego. Natomiast z drugiej strony nie musi być cokolwiek abstrakcyjnego, żeby móc utworzyć klasę abstrakcyjną. Tłumacząc prościej:

  • klasa MUSI być abstrakcyjną, jeżeli choć jedna składowa jest abstrakcyjna (pole / metoda / właściwość),
  • klasa MOŻE być abstrakcyjną, nawet jeśli nie posiada w sobie żadnych składowych abstrakcyjnych.

Warto jeszcze żebyście wiedzieli, że to, że klasa jest abstrakcyjną wcale nie znaczy, że nie może mieć niczego ściśle określonego. Może!

METODA ABSTRAKCYJNA

"abstract" w języku C# nałożone na metodę nadaje już zupełnie innego kształtu składniowego. Metoda abstrakcyjna nie posiada żadnej definicji, bo na tym właśnie polega abstrakcja. W momencie, kiedy metoda staje się abstrakcyjną, dajemy kompilatorowi do zrozumienia, że nie jesteśmy w stanie zdefiniować jakiegoś ogólnego wzorca działania tej metody dla każdej klasy potomnej bez wyjątku. A przypominam, że postulat abstrakcji jest wykorzystywany głównie z myślą dla zachowania jeszcze większej spójności implementacji w klasach potomnych. Zatem, są dwa rozwidlenia.

KLASA ABSTRAKCYJNA

Dla klasy abstrakcyjnej definiujemy jedynie sam nagłówek, aby metoda była abstrakcyjną:

abstract class MyAbstractClass
{
	public abstract void DoSomethingSpecific();
}

Patrzcie! Średnik kończący instrukcję zaraz po liście parametrów formalnych! W dodatku nie ma tu żadnych klamerek, bo tym razem to byłby błąd kompilacji! Pamiętajcie, metoda abstrakcyjna to znak niemożności zaimplementowania jakiegokolwiek ogólnego wzorca zachowania dla wszystkich klas potomnych!

KLASA POTOMNA

W klasie potomnej zaś utworzy się przez to obowiązek przesłonięcia i zaimplementowania instrukcji dla metody abstrakcyjnej, o ile sama klasa potomna nie jest abstrakcyjną (gdyby tak było, obowiązek definiowania "zwala się" na kolejną klasę nieabstrakcyjną):

class MyChildClass : MyAbstractClass
{
	public override void DoSomethingSpecific()
	{
		// przesłonięcie metody albo błąd kompilacji!
	}
} 
WŁAŚCIWOŚĆ ABSTRAKCYJNA

Właściwość typu "abstract" w języku C# może być ciut skomplikowane, jednak jeśli uważacie na klamerki i robicie odpowiednie wcięcia, na pewno nie popełnicie błędu :). Przede wszystkim, musicie się zdecydować czy ma być akcesor, mutator, czy też akcesor i mutator jednocześnie. Dajmy na to, że oba:

abstract class MyAbstractClass
{
	public abstract int Score {get; set;}
	
	protected int score;
}

to wówczas w klasie potomnej nieabstrakcyjnej, musicie zdefiniować i jedno, i drugie!

class MyChildClass : MyAbstractClass
{
	public override int Score
	{
		get
		{
			return 200*lives;
		}
		set
		{
			score = value;
		}
	}
}

Kapujecie? Jak sam "getter", to "get". Jak "setter", to "set". Jak oba, to oba. Nie ma żadnych kombinacji "pół na pół"!

Słowo kluczowe "abstract" w języku C#

Modyfikator "abstract" czyni klasę, metodę i właściwość jednocześnie, abstrakcyjną. Na mocy postulatu abstrakcji, wymusza to implementację na nieabstrakcyjnych klasach potomnych.


Zakończyliśmy wspólnie kolejny istotny wątek zaliczany do absolutnych fundamentów programowania obiektowego. "abstract" w języku C# - skuteczne narzędzie do konstruowania szablonów dla przyszłych klas potomnych i wymuszania na nich implementacji! Bądźcie pewni, że to się Wam bardzo przyda!

PODOBNE ARTYKUŁY