Oto część druga dotycząca mechanizmu paradygmatu obiektowego jakim jest dziedziczenie w języku Java. Poprzednio wprowadziłem Was w ten temat bardzo powierzchownie, a teraz zapoznacie się z kolejnym elementem, który bądź co bądź może stanowić jedynie "dekorację" aczkolwiek mogącą zabezpieczyć przed tworzeniem instancji zbyt ogólnego obiektu. Dowiecie się co to jest klasa abstrakcyjna, czym się ona różni od "zwykłej" oraz jak ona wpływa na przebieg pisania kodu.

DZIEDZICZENIE W JĘZYKU JAVA BEZ KLASY "ZBYT OGÓLNEJ"

Odwołując się do tego samego przykładu w poprzednim artykule, mieliśmy klasę "Character", która jak stwierdziłem, nie powinna wykorzystywana do tworzenia instancji. W przeważającej większości przypadków drzewo dziedziczenia tak się konstruuje, że "korzeń" stanowi jedynie szkielet samych czynników ogólnych i posiada za mało informacji, aby na jego podstawie tworzyć obiekty. Dlatego też, taka klasa powinna być klasą "abstrakcyjną". Oznacza to, że sygnalizujemy kompilatorowi, że dana klasa jest zbyt ogólna, aby był sens tworzenia obiektów w oparciu o jej (niekompletne) dane składowe i metody.

Jak napisałem na początku, to tak naprawdę jest jedynie dbałość o szczegół i jest to traktowane całkowicie opcjonalnie bo program od tego się nie wysypie (ani świat nie wyginie) i to pozostaje do uznania programisty czy ma ochotę to osadzić w kodzie (jeśli to ma sens). Zaczyna to mieć większe znaczenie gdy ten sam kod ma być później wykorzystywany przez kogoś innego. Wtedy taka klasa pozwalająca jedynie na dziedziczenie w języku Java może oszczędzić pewnych problemów.

KLASA ABSTRAKCYJNA W KODZIE ŹRÓDŁOWYM

Słowo kluczowe czyniące klasę abstrakcyjną to "abstract". Podajemy je pomiędzy słowami "public", a "class". Aby trzymać się tego samego przykładu, dorzucę ten sam co poprzednio tylko z drobnymi modyfikacjami, zatem dziedziczenie w języku Java pozostaje takie same:

  • KLASA "Main"
public class Main
{
	public static void main(String[] args)
	{
		Warrior w = new Warrior(8);

		w.saySomething();
	}
}
  • KLASA "Character"
public abstract class Character
{
	private int level;

	public void setLevel(int level)
	{
		this.level = level;
	}

	public void saySomething()
	{
		System.out.println("Wypowiadam się z klasy " + getClass().getSimpleName() + ". Mam poziom " + level);
	}
}
  • KLASA "Warrior"
public class Warrior extends Character
{
	public Warrior(int level)
	{
		setLevel(level);
	}
}

Nic drastycznie się nie zmieniło. Wprowadzenie modyfikatora "abstract" zapobiega tworzeniu instancji klasy "Character" czyli tej, którą uznałem za "zbyt ogólną". To właściwie jest jedyna moja porada kiedy to umieszczać. Kiedy jesteście pewni, że dana klasa nie dostarcza wystarczającej ilości informacji, aby obiekt tego typu stał się samodzielnym bytem. Innym przykładem mogłaby być klasa "Human", a klasami dziedziczącymi na przykład "Teacher", "Singer" czy też "Actor". Rozumiecie? Każdy z nas jest człowiekiem, ale to jest za ogólne stwierdzenie. Musi być jeszcze jakiś bardziej szczegółowy "filtr" i to może być podział na zawody. Wtedy dziedziczenie w języku Java ma ręce i nogi.

Klasa abstrakcyjna i dziedziczenie w języku Java

Słowo kluczowe "abstract" informuje kompilator, że dana klasa jest "zbyt ogólna", aby był sens tworzyć obiekty na jej podstawie.


Kolejną część mamy za sobą, jutro ciągniemy ten wątek dalej...

PODOBNE ARTYKUŁY