1. Wieloryby i krowy

Oto ciekawy fakt zoologiczny: krowa jest znacznie bliższa wielorybowi niż np. hipopotamowi. Okazuje się, że krowy i wieloryby są stosunkowo bliskimi krewnymi.

Popatrz tutaj. Opowiemy o polimorfizmie — kolejnym bardzo potężnym narzędziu OOP . Ma cztery cechy.


2. Dziedziczenie nie jest panaceum

Wyobraź sobie, że napisałeś Cowklasę do gry. Ma wiele pól i metod. Obiekty tej klasy mogą robić różne rzeczy: chodzić, jeść i spać. Krowy noszą również dzwonek, który dzwoni, gdy chodzą. Załóżmy, że zaimplementowałeś wszystko w klasie w najdrobniejszych szczegółach.

A potem przychodzi twoja klientka i mówi, że chce wypuścić nowy poziom gry, w którym cała akcja toczy się na morzu, a głównym bohaterem jest wieloryb.

Zaczynasz projektować Whaleklasę i zdajesz sobie sprawę, że różni się ona tylko nieznacznie od Cowklasy. Logika obu klas jest bardzo podobna i decydujesz się na dziedziczenie.

Polimorfizm w Javie

Klasa Cowidealnie nadaje się do przejęcia roli klasy nadrzędnej: posiada wszystkie niezbędne zmienne i metody. Wszystko, co musimy zrobić, to dać wielorybowi umiejętność pływania. Ale jest problem: twój wieloryb ma nogi, rogi i dzwonek. W końcu ta funkcjonalność jest zaimplementowana wewnątrz Cowklasy. Co można tutaj zrobić?

Polimorfizm w Javie.  Dziedzictwo

3. Nadpisywanie metod

Nadpisywanie metod przychodzi nam na ratunek. Jeśli odziedziczyliśmy metodę, która nie do końca robi to, czego chcemy w naszej nowej klasie, możemy zastąpić tę metodę inną.

Przesłanianie metody

Jak to się robi? W naszej klasie potomnej deklarujemy tę samą metodę, co metodę klasy nadrzędnej, którą chcemy przesłonić. Piszemy w nim nasz nowy kod. I to wszystko — to tak, jakby stara metoda w klasie nadrzędnej po prostu nie istniała.

Tak to działa:

Kod Opis
class Cow
{
   public void printColor ()
   {
      System.out.println("I'm a white whale");
   }

   public void printName()
   {
      System.out.println("I'm a cow");
   }
}

class Whale extends Cow
{
   public void printName()
   {
      System.out.println("I'm a whale");
   }
}
  • Zdefiniowano tutaj dwie klasy — CowiWhale
  • WhaledziedziczyCow
  • Klasa Whaleprzesłania printName()metodę
public static void main(String[] args)
{
   Cow cow = new Cow();
   cow.printName();
}
Ten kod wyświetla następujący tekst na ekranie:
I'm a cow
public static void main(String[] args)
{
   Whale whale = new Whale();
   whale.printName();
}
Ten kod wyświetla na ekranie:
I'm a whale

Po odziedziczeniu Cowklasy i zastąpieniu printNamemetody, Whaleklasa faktycznie zawiera następujące dane i metody:

class Whale
{
   public void printColor()
   {
      System.out.println("I'm a white whale");
   }

   public void printName()
   {
      System.out.println("I'm a whale");
   }
}
Nie znamy żadnej starej metody.