W tym wpisie oderwiemy się od konkretnego języka programowania. Wzniesiemy się na nieco wyższy poziom abstrakcji (choć przykłady będą dość przyziemne). Dowiemy się czym są w programowaniu klasy i obiekty.
Klasy i obiekty – krok pierwszy
Bardzo popularnym porówaniem, które pomaga zrozumieć czym są klasy jest to z planem architektonicznym domu.
Szukając czy to projektu naszego domu, czy mieszkania do kupna przedzieramy się przez dziesiątki zdjęć. Architektoniczne z planem pomieszczeń, komputerowe wizualizacje, czy zdjęcia faktycznego stanu nieruchomości. Wszystko to tworzy w naszej głowie pewien obraz. Nasz dom ma cztery pokoje, ściany będą pomalowane na jakiś kolor, będzie kilka okien. Nie wiemy jeszcze, czy drewnianych, czy plastikowych. Wiemy, że będą.
Tworzy nam się w głowie pewien abstrakcyjny model. Wiemy z czego będzie składał się nasz dom, ale nie mamy jeszcze konkretów. Wiemy, że ściany będą, ale nie wiemy jakiego koloru. Mamy informację, że są do dyspozycji cztery pokoje, ale nie do końca jeszcze wiemy co, gdzie zrobimy.
Idąc tym tropem obiekt to fizyczna reprezentacja, gotowe już mieszkanie gdzie ściany mają już ustalony kolor, a pokoje przydzielone funkcje. Dodatkowo domów na podstawie tego samego projektu może powstać wiele. Każdy z nich jednak będzie fizycznie innym obiektem, nawet jeśli będzie miał ten sam kolor ścian.
Klasy i obiekty – krok drugi
Przekładając powyższe na dziedzinę tworzenia oprogramowania – klasa jest to pewien wzór, zestaw zgrupowanych pod jednym szyldem danych, które będą charakteryzować każdy obiekt stworzony na podstawie tej klasy. Możemy stworzyć np. klasę o nazwie House, która będzie zawierała informację o kolorze ścian i imieniu właściciela.
class House { Color wallColor; String ownerName; }
Na podstawie tej klasy można już tworzyć obiekty, czyli już struktury z konkretnymi wartościami dla każdego z pól zdefiniowanych przez klasę.
House house1 = new House(Color.RED, "Paweł"); House house2 = new House(Color.BLUE, "Darek");
Tak zdefiniowany house1 ma czerwone ściany, a właścicielem jest Paweł. Natomiast drugi dom należy dla Darka i ma on niebieskie ściany.
Trzeba zapamiętać bardzo ważny fakt: w (niemal) każdym języku obiektowym, jeśli tworzymy nowe obiekty (głównie za pomocą słowa kluczowego new) to nawet jeśli dwa domy mają takie same wartości dla pól to NIE są to te same obiekty. Zajmują różne miejsca w pamięci.
House house1 = new House(Color.RED, "Paweł"); House house3 = new House(Color.RED, "Paweł");
W powyższym przykładzie – pomimo tego, że dwa, nowo utworzone domy mają te same wartości dla zdefiniowanych w klasie House pól, to są to fizycznie dwa różne domy. W zajmują różne miejsca w pamięci. Metaforycznie możemy myśleć, że jeden znajduje się na ulicy Krakowskiej, drugi na Warszawskiej. Przypadkiem mają właścicieli o tych samych imionach, którzy preferują ściany w czerwonym kolorze.
Klasy często nazywamy również typami danych, natomiast każdy z obiektów utworzonych na podstawie danej klasy nazwiemy instajcą klasy.
Elementy składowe
Niezależnie od języka każda klasa może składać się z kliku elementów składowych.
Pola
Po pierwsze jest to definicja pól (zwanych również stanem bądź, rzadziej, zmiennymi klasy). Czyli jest to zestaw informacji przechowywanych przez daną klasę, na których może ona również operować.
class TV { dimension: number; isOn: boolean; }
W powyższym przykładzie mamy klasę o nazwie TV, z dwoma stanami: dimension, czyli przekątną ekranu oraz flage isOn informującą czy TV jest uruchomiony, czy nie.
Metody
Kolejnym elementem składowym są metody, zwane również funkcjami. Są to operacje, akcje, jakie nasz obiekt może wykonywać. Na przykład telewizor można włączyć bądź wyłączyć.
class TV { dimension: number; isOn: boolean; function turnOn() : void { this.isOn = true; } function turnOff() : void { this.isOn = false; } }
Konstruktor
Ostatnim, wspólnym elementem jest konstruktor. Jest to specyficzny rodzaj metody, który jest uruchamiany, gdy tworzony jest nowy obiekt za pomocą słowa kluczowego new. Służy on do ustawienia początkowych wartości dla pól obiektu.
class TV { dimension: number; isOn: boolean; constructor(dimension: number) { this.dimension = dimension; isOn = false; } function turnOn() : void { this.isOn = true; } function turnOff() : void { this.isOn = false; } }
Jeden komentarz do “Czym są klasy i obiekty w programowaniu? Podstawy programowania obiektowego.”