Kurs Java

Polimorfizm

W rozdziale Klasy - Dziedziczenie (Inheritance) wspominamy o tym, że klasa dziedzicząca z innej klasy (nadklasy) jest tego samego typu co ta nadklasa. Podobnie w rozdziale Interfejs jako typ danych podkreślamy to, że obiekt klasy implementującej interfejs jest obiektem typu tego interfejsu. Taki rodzaj relacji w Javie jest określany mianem relacji IS - A.

Jeśli weźmiemy teraz pod uwagę to, że:
  • dana nadklasa może być rozszerzana przez wiele klas
  • interfejs może być również implementowany przez wiele klas
to każda z tych wielu klas ma prawo dostarczyć własną implementację metod nadklasy lub interfejsu.

Dzięki temu nadklasa lub interfejs mogą przybierać różne formy i taką zdolność nazywamy polimorfizmem.

Polimorfizm na bazie klasy

Załóżmy, że tworzymy aplikację do zarządzania dokumentami. Na początek posiadamy cztery klasy. Jako bazę mamy nadklasę - DocumentItem, która dla uproszczenia posiada tylko jedną metodę - getDescription. Mamy też trzy konkretne klasy pochodne, które dostarczają własne implementacje metody getDescription. Mówimy, że metody te przesłaniają metodę z klasy bazowej, co zresztą jest zgodne z treścią rozdziału Przesłanianie metod.
public class DocumentItem {         
    
    public String getDescription() {
    	return "Class representing some document.";
    }          
} 
public class WordDocument extends DocumentItem {
    
    public String getDescription() {
    	return "Class representing word document.";
    }
}
public class ExcelDocument extends DocumentItem {
    
    public String getDescription() {
        return "Class representing calculations.";
    }
} 
public class PdfDocument extends DocumentItem {
    
    public String getDescription() {
        return "Class representing pdf document.";
    }          
} 
Tym samym klasa bazowa DocumentItem staje się bytem przyjmującym wiele form, w zależności od tego, której implementacji użyjemy. Podczas działania programu może ona występować zarówno w postaci obiektu klasy WordDocument, ExcelDocument, jak i PdfDocument. Zobaczmy w programie:
public class Start {

    public static void main(String[] args) {

        DocumentItem wordItem = new WordDocument();
        DocumentItem excelItem = new ExcelDocument();
        DocumentItem pdfItem = new PdfDocument();

        System.out.println(wordItem.getDescription());
        System.out.println(excelItem.getDescription());
        System.out.println(pdfItem.getDescription());        
    }
}
Po uruchomieniu programu na konsoli pojawi się wydruk pokazujący że mi tego, iż każdy obiekt jest typu DocumentItem, to jednak występuje on w trzech postaciach (mamy trzy różne wydruki):
Java - przykład polimorfizmu

Polimorfizm na bazie interfejsu

W przypadku interfejsu sprawa wygląda niemalże identycznie. Różnica polega na samej idei interfejsów, które przede wszystkim definiują nam to, co ma zostać wykonane przez klasę implementującą, a nie jak to ma to być zrobione. Posiadając trzy klasy implementujące ten sam interfejs, mamy również trzy różne formy dla tego samego typu - w tym przypadku dla PrinterService. Każda z trzech klas przesłania metodę printDocument:
public interface PrinterService {         
    
    void printDocument();
} 
public class  DocumentPrinter implements PrinterService {
    
    public void printDocument() {
        System.out.println("Printing document...");
    }          
} 
public class  CardPrinter implements PrinterService {
    
    public void printDocument() {
        System.out.println("Printing card...");   
    }             
}
public class  ImagePrinter implements PrinterService {
    
    public void printDocument() {
        System.out.println("Printing image...");
    }
} 
Na koniec zobaczmy, jak to będzie wyglądało w programie:
public class Start {

    public static void main(String[] args) {
    
        PrinterService documentPrinter = new DocumentPrinter();
        PrinterService cardPrinter = new CardPrinter();
        PrinterService imagePrinter = new ImagePrinter();
        
        documentPrinter.printDocument();
        cardPrinter.printDocument();
        imagePrinter.printDocument();
    }
}
Ponownie, mimo że każdy obiekt jest typu PrinterService, to jednak występują one równocześnie pod postacią trzech różnych typów wywodzących się z PrinterService (stąd mamy trzy różne wydruki, każdy z innej klasy implementującej interfejs):
Java - przykład polimorfizmu na interfejsie
Zdjęcie autora
Autor: Jarek Klimas
Data: 03 stycznia 2024
Labele: Backend, Podstawowy, Java
Masz pytanie dotyczące tego rozdziału? Zadaj je nam!
Masz pytanie dotyczące prezentowanego materiału?
Coś jest dla Ciebie niejasne i Twoje wątpliwości przeszkadzają Ci w pełnym zrozumieniu treści?
Napisz do nas maila, a my chętnie znajdziemy odpowiednie rozwiązanie.
Najciekawsze pytania wraz z odpowiedziami będziemy publikować pod rozdziałem.
Nie czekaj. Naucz się programować jeszcze lepiej.
kursjava@javappa.com

Stale się rozwijamy, a więc bądź na bieżąco!
Na ten adres będziemy przesyłać informacje o ważniejszych aktualizacjach, a także o nowych materiałach pojawiających się na stronie.
Polub nas na Facebooku:
Nasi partnerzy: stackshare
Javappa to również profesjonalne usługi programistyczne oparte o technologie JAVA. Jeśli chesz nawiązać z nami kontakt w celu uzyskania doradztwa bądź stworzenia aplikacji webowej powinieneś poznać nasze doświadczenia.
Kliknij O nas .


Pozycjonowanie stron: Grupa TENSE