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
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