Polimorfizm

Ziomal

Polimorfizm możemy określić jako wirtualizację operacji; jest to możliwość dynamicznego (późnego, realizowanego w fazie wykonania) wiązania nazwy operacji do wielu implementacji (metod) tej operacji w różnych klasach pozostających w relacji dziedziczenia. Wiązaniu towarzyszy mechanizm wyboru konkretnej implementacji. Wybór implementacji zależy od nazwy metody oraz od typu dynamicznego tego obiektu, dla którego została wywołana operacja, a nie od typu zmiennej, wskazującej ten obiekt.

Zauważmy, że przeciążanie operacji nie prowadzi do polimorfizmu; w tym przypadku wiązanie, dopasowanie parametrów wywołania operacji do określonej sygnatury i wybór implementacji są statyczne, ponieważ są wykonywane w fazie kompilacji. Muszą wówczas istnieć różnice w sygnaturach operacji (w typie wyniku i/lub w typach parametrów wejściowych), a kryterium wyboru implementacji zależy od tych różnic.

W języku Java wszystkie deklaracje metod, które nie są metodami klasy, ani metodami finalnymi, można traktować jako operacje wirtualne. Tak więc definicja metody o danej sygnaturze w superklasie może być przesłonięta przez definicję metody o tej samej sygnaturze w podklasie. W rezultacie kompilator nie może związać nazwy metody z jej implementacją (istnieją co najmniej dwie implementacje o takich samych sygnaturach). Wiązanie może się odbyć dopiero w fazie wykonania; wówczas interpretator określa typ dynamiczny obiektu na którym zostaje wywołana operacja i wiąże tę operację z właściwą dla danego obiektu implementacją. Ilustrację wywołania polimorficznego pokazuje poniższy prosty przykład:

Plik Polimorf.java:

class Base {
public void msg()
{
 System.out.println("Base class method");
 }
}
class Derived extends Base {
public void msg()
{
 System.out.println("Derived class method");
 }
}
public class Polimorf {
    int i = 10;
    public static void main(String args[])
    {
     Base b1 = new Base();
     b1.msg();
     b1 = new Derived();
     if(b1 instanceof Derived)
     System.out.println("Derived");
     b1.msg();
    }
}

Metoda msg() ma dwie implementacje: w klasie Base i w klasie Derived. Odniesienie (referencja) b1 do klasy Base jest najpierw inicjowane obiektem klasy Base, a więc instrukcja b1.msg(); wywoła metodę tej klasy. Następnie odniesieniu b1 zostaje przypisany obiekt klasy Derived, co spowoduje, że następna instrukcja b1.msg(); wywoła implementację metody msg() zdefiniowaną w klasie Derived. Instrukcja if wykorzystująca operator instanceof służy do sprawdzenia, jaki jest typ dynamiczny obiektu b1. Wynikiem wykonania programu będzie następujący wydruk:

Base class method
Derived
Derived class method

Autor: Dariusz Frankowski
Artykuł pochodzi z magazynu komputerowego @T.
Darmową prenumeratę możesz złożyć na www.at.w.pl

3 komentarzy

i to ma byc artykul na temat polimorfizmu? żałosne

"Muszą wówczas istnieć różnice w sygnaturach operacji (w typie wyniku i/lub w typach parametrów wejściowych), a kryterium wyboru implementacji zależy od tych różnic."
W Javie nie można przeciążać metod poprzez różne wartości zwracane, a jedynie poprzez różne typy argumentów lub różna ich kolejność.

zerżnięte! http://www.escom.net.pl/support/index632c.html?escom:JAVA
pokaż pozwolenie od autora, albo zarobisz bana