Języki obiektowe

 

Programowanie obiektowe

 

Założeniem programowania obiektowego jest jak najmocniejsze odzwierciedlenie rzeczywistości i modelowanie oprogramowania zgodny ze sposobami postrzegania świata przez człowieka.

 

  1. Elementy świata rzeczywistego oraz zachodzące w nim relacje przedstawiamy za pomocą obiektów.
  2. Każdy obiekt ma swoje stany określone przez wartości atrybutów/pól (parametrów) oraz dostępne metody (operacje/procedury, które może wykonywać) - analogicznie do obiektów świata rzeczywistego, które mają pewną charakterystykę (parametry - dane składowe) i zachowują się w określony sposób (mają takie same możliwe zachowania/możliwości). Obiekt to skomplikowana "zmienna", która przechowuje dane, ale na żądanie może także wykonywać na sobie pewne operacje.
  3. Obiek jest wyposażony w "pamięć", w której mogą występować inne obiekty. Czyli nowe obiekty mogą być zbudowane z wielu różnych obiektów.
  4. Program obiektowy to zestaw obiektów, ktore wzajemnie się komunikują, wysyłając do siebie żądania, przez wywoływanie swoich metod (wewnętrznych funkcji należących do konkretnych obiektów).
  5. Definiujemy grupy obiektów o wspólnych cechach/parametrach i funkcjonalnościach (KLASY). Klasa obiektów określa typ grupy obiektów, które posiadają takie same parametry - atrybuty/pola i funkcje - metody.
  6. Klasa to definicja grupy obiektów, a obiekt danej klasy to instancja - wystąpienie tej klasy.
  7. Utworzony obiekt danej klasy - instancja klasy - może zostać jednoznacznie odróżniony od wszystkich innych obiektów. W Javie każdy obiekt jest umieszczany w pamięci na tzw. stercie pod unikatowym adresem.

     

     

    PRZYKŁADY KLAS I OBIEKTÓW:

     

     

    klasa SamochódOsobowy

    Klasa to definicja zbioru obiektów o takich samych atrybutach (cechach) i metodach (funkcjach). Klasa to "szablon" według którego mogą być utworzone obiekty danej klasy.

     

    arybuty:
    • marka
    • kolor
    • liczba miejsc dla kierowcy i pasażerów

    metody:

    • uruchomSilnik()
    • ustawBieg( int nrBiegu )
    • zamknijOkno( int idOkna )
    • zahamuj()

     

     

    Przykłady instancji (obiektów) klasy SamochódOsobowy

    Obiekt danej klasy to konkretny egzemplarz (instancja/wystąpienie) tej klasy - np. samochód określonej marki o określonym numerze nadwozia

    • Syrena 105, kremowy - Nr nadwozia CNHW65KGHS
    • Fiat 126p, czerwony - Nr nadwozia PF125MJDGZE4

     

     

  8. W kontekście programowania dane i procedury dostępne w obiekcie są ze sobą ściśle powiązane.
  9. W programowaniu zorientowanym obiektowo klasa (typ obiektów) to abstrakcyjny typ danych. Można tworzyć zmienne takiego typu (konkretne egzemplarze obiektów danej klasy).
  10. W programie obiektowym obiekty komunikują się ze sobą, wywołując swoje metody w celu wykonania określonych zadań.

     

     

    Cechy typowe dla programowania obiektowego

     

    • hermetyzacja danych - w programie obiektowym dostęp do składowych elementów klasy lub obiektu jest ograniczony za pomocą dobrze określonego interfejsu (gdzie interfejs, to zestaw metod służących do odczytywania i zapisywania danych oraz uruchamiania i zatrzymywania określonych akcji). Java ma mocno rozbudowane mechanizmy określania dostępu do poszczególnych klas, obiektów, atrybutów i metod.

       

      class SamochódCiężarowy {
           private int szerokośćŁadowni;    // Szerokość ładowni - zmienna prywatna - nie dostępna dla obiektów zewnętrznych
      
           public int getSzerokośćŁadowni() {    // Publicznie dostępny interfejs umożliwiający odczytanie szerokości ładowni
                 return szerokośćŁadowni;
           } 
      }

       

       

    • dziedziczenie - mechanizm umożliwiający dziedziczenie / wywodzenie nowych klas z klas już istniejących, wraz z przejmowaniem ich atrybutów i metod. Obiekt klasy potomnej jest jednocześnie obiektem klasy dziedziczonej (nadrzędnej w drzewie hierarchii dziedziczenia).

       

      Na pokazanym wyżej diagramie obiekt klasy SamochódSpalinowy jest jednocześnie obiektem klasy Pojazd, obiektem klasy PojazdKołowy itd.

      Czyli w rzeczywistości obiekt klasy SamochódSpalinowy jest "wyposażony" w następujący zestaw atrybutów i metod:

       

       

    • abstrakcja - możliwość zredukowania właściwości opisywanego obiektu do najbardziej podstawowych, a następnie tworzenia wielu poziomów definicji obiektu o coraz większym stopniu szczegółowości.

       

      Przykład klasy zdefiniowanej jako abstrakcyjna. Klasie abstract musi wystąpić przynajmniej jeden element abstrakcyjny. Element abstrakcyjny to element bez implementacji - jedynie "szablon" - określający, że w każdej klasie nie abstrakcyjnej odziedziczonej z tej klasy abstract musi wystąpić zaimplementowana metoda o takiej samej nazwie, zwracanym typie oraz takich samych parametrach wywołania. Jeśli wszystkie elementy kasy są abstrakcyjne, wówczas taka klasa jest interfejsem a nie klasą i nie może występować jako abstract class, lecz musi występować jako interface.

       

       

    • polimorfizm - wielopostaciowość; w Javie występują dwa typy polimorfizmu - polimorfizm klas i polimorfizm metod;

       

      polimorfizm klas

      Klasa może dziedziczyć właściwości wielu Interfejsów. Interfejs określa zestaw atrybutów i metod, które dana klasa musi implementować. Interfejsy reprezentują różne typy obiektów. Klasa może implementować wiele interfejsów - może więc być reprezentowana przez różne typy. Na pokazanym niżej diagramie obiekt klasy LotokotMalezyjski implementującej zaprezentowane interfejsy może być traktowany jako obiekt typu FruitEatingAnimal, RunningAnimal, TreeClimbingAnimal oraz SoaringAnimal.

       

       

      polimorfizm metod

      W pokazanym niżej przykładzie każdy obiekt klasy PojazdSpalinowy jest "wyposażony" w trzy różne metody zatankujPaliwo(). Wszystkie metody zatankujPaliwo() muszą tak samo się nazywać i muszą zwracać taki sam typ wartości (w tym wypadku wszystkie muszą być typu void - nie zwracają żadnej wartości). Natomiast mogą różnić się pod względem ilości i typu parametrów wywołania metody.

       

      class PojazdSpalinowy extends Pojazd implements PojazdSilnikowy {
            ...
      
            public void zatankujPaliwo( ) {    //  Metoda bez argumentu - zatankuj do pełna
                 [...implementacja metody...]
            }
      
            public void zatankujPaliwo( float ilośćPaliwa ) {    //  Metoda w której określona jest liczba litrów paliwa do zatankowania
                 [...implementacja metody...]
            }
      
            public void zatankujPaliwo( int ilośćProcentPojemnościBaku ) {    // Metoda w której określony jest procent pojemności baku 
                                                                              // np. 50 oznacza połowę baku
                 [...implementacja metody...]
            }
      }