OOP

PVA1


Bc. Matěj Cajthaml — SSPŠ

©

Co je to objektově orientované programování?

Způsoby programování

  • programovací paradigmata
  • přístup k tvorbě programů
  • většina jazyků podporuje více paradigmat

  • objektově orientované programování (OOP)
  • datově orientované programování
  • funkcionálně orientované programování

OOP není jediný správný způsob programování.

My budeme cílit pouze na OOP

K pochopení ostatních typů programování je potřeba tyto základy znát.

Myšlenky OOP

  • obyčejný kód je nepřehledný a velmi těžko se spravuje
  • rozdělíme kód na menší části (jako funkce)
  • všechno bude v určitých balíčkách (objektech)
  • data lze rozdělit do opakujících se balíčků

OOP

  • OOP se skládá z:
    • tříd — class
    • instancí / objektů — instance / object
    • metod — method

Třídy

Můžeme si představit jako šablony či formuláře

Celý formulář

Co na těchto formulářích vidíte?

Co vám každý tento formulář zaručuje?

a to přesně třídy dělají!

Třídy

  • šablona / formulář
  • má jméno
  • podle které se vytváří nějaké balíčky dat
  • v každé třídě definujeme vlastnosti — proměnné
    • tyto vlastnosti bude mít každé vytvoření podle třídy
    • mají jméno a datový typ

Třídy v C#

Při definici třídy se stane jméno třídy klíčové a bude datovým typem.

Vlastnosti pojmenováváme jednotným stylem a nejlépe v angličtině.

Instance

  • již známe ze struktur
  • vytvoříme dle šablony (třídy) objekt
  • daný objekt bude mít dané vlastnosti
  • k vlastnostem přistupujeme pomocí .

Instance v C#

Modifikátor public

Prozatím před všechny vlastnosti dáváme modifikátor public. Proč to děláme, si vysvětlíme později.

Ve třídě můžeme ve vlastnosti použít i jinou třídu.

Instance jsou vlastní balíčky dat — data si nepředávají a nesdílejí je.

Co je to objektově orientované programování?

Metody

  • funkce uvnitř tříd
  • jsou vázané na danou instanci
  • mají k dispozici všechny vlastnosti instance a mohou je upravovat
  • můžeme je volat přímo uvnitř nebo zvenku instance
  • mohou vracet cokoliv, i void

Definice

S parametry

S parametry

Přístup k instanci — this

  • dovoluje nám přistupovat k instanci
  • hlavní důvod k používání je kolize s parametry

Komplexnější přístupy

Modifikátor

  • modifikuje určitou část kódu
  • aktuálně jsou to pro nás vlastnosti a metody
  • modifikátor viditelnosti

Modifikátor viditelnosti

  • určuje, odkud je daná vlastnost třídy k dispozici
  • public — viditelná odkudkoliv, i mimo třídu
  • private — viditelná pouze uvnitř třídy

Ukázka

Jaký modifikátor viditelnosti mají prvky třídy, když jej neurčíme?

K čemu se nám modifikátor viditelnosti hodí?

Konstruktor

  • jedná se o speciální metodu
  • daná metoda se vyvolává při vytváření instance
  • můžeme do ní předávat parametry

Ukázka

K čemu se nám konstruktory hodí?

Můžeme mít více konstruktorů?

K čemu by nám byly?

Ukázka

Můžeme vytvořit privátní konstruktor?

K čemu by nám byl?

Třídy lze vytvářet ve vlastních souborech.

VS nám dovoluje automaticky generovat konstruktor.

Dedičnost

  • dovoluje nám zdědit vlastnosti a metody z jiné třídy
  • tyto vlastnosti nyní budou náležet dané třídě a můžeme je číst a upravovat
  • k instanci této třídy můžeme přistupovat, jako kdyby to byla třída, ze které dědíme

K čemu by se mohla dědičnost hodit?

Zlepšení přehlednosti kódu

a co kdybychom chtěli něco přidat do prvního řešení?

Výhody

  • kód se nám zpřehlední
  • jednoduší přístup k podobným objektům

Nevýhody

  • při velkém množství objektů a tříd začně být nepřehledné
  • zejména při velkém zanořování

Abstrakce

  • zmíněný způsob ukládání dat podobných datových struktur na jednom místě
  • stačí nám ukládat obecnou nejnižší děděnou třídu
  • další věci než děděná třída obsahuje potřebujeme jen někdy

Zkontrolování typu

  • při abstrakci se nám hodí ukládat typy dohromady
  • někdy se nám ale nehodí k nim tak přistupovat
  • pomocí operatoru is můžeme zkontrolovat, zda je instance z nějaké třídy
  • může být exaktní nebo děděná

Aktuální dědičnost dovoluje dědit pouze vlastnosti, které jsou public. private se nenabízí, proč tomu tak je?

Modifikátor viditelnosti protected

  • podobné private
  • nyní ale k vlastnosti/metodě budou moci přistupovat i třídy, které z této třídy dědí

K čemu nám slouží konstuktory?

Klíčové slovo base

  • umožnuje nám přistupovat k nadřazené třídě, ze které dědíme
  • můžeme volat metody a konstruktory

Lze dědit jen z jedné třídy.

Všechny třídy nakonec dědí ze třídy Object.

base volá nadřazený konstruktor, který může volat jeho nadřazený konstruktor a tak dále.

Bude to fungovat?

Co to vypíše do konzole?

Přepsání metod

  • způsob úpravy metod děděných tříd
  • upravíme, co bude daná metoda dělat
  • máme tři typy
  • typy se liší dle toho jak abstrakce mění jejich volání

Skrytí — new

  • skryjeme již existující metodu s nějakým kódem
  • dědic bude moci používat nově definovanou, stará bude k dispozici jen pomocí base
  • stačí použít stejnou metodu se stejným:
    • jménem
    • argumenty
    • návratovým datovým typem
  • zmenšení na děděnou třídu nám skrytí resetuje
  • metody často označujeme pomocí new

Co to vypíše do konzole?

Virtuální — virtual

  • modifikátorem virtual označujeme metodu, která se může prepsat
  • při změněne kontextu třídy nám zůstane metoda k dispozici
  • třídu nemusíme přepisovat, pokud nebudeme chtít
  • používáme klíčová slova override a virtual

Co to vypíše do konzole?

Jaký je rozdíl mezi tímto přístupem a virtuálním přepsáním?

Abstraktní — abstract

  • metoda z abstraktní třídy nemá tělo (kód, tj. příkazy)
  • metodu kterou budeme přepisovat označujeme abstract
  • metodu přepisujeme pomocí override
  • metodu musí dědic PŘEPSAT, tj. ji definovat

Abstraktní třídy

  • nemohou existovat samostatně
  • můžeme je však referovat v kódu

Může mít abstraktní třída neabstraktní metodu?

Polymorfismus

  • (klasický buzz-word)
  • mnoho tvarů
  • základní dvě ideologie:
    • objekty mohou být odpojeny od své původní třídy a být reprezentovány tou zděděnou
    • základní třídy mohou definovat virtuální nebo abstraktní metodu, kterou dědic může přepsat a zapříčinit vlastní chování

Neviděli jsme již někde polymorfismus?

Polymorfismus tedy zapříčíní že podobné objekty mají společného předka, který definuje metodu, kterou dědicové přepisují pro vlastní (podobné) chování.

Polymorfismus

Práce

Vymyslete vlastní polymorfismus pro nějaký příklad. Napište program (třídy, případně použití), kde polymorfismus použijete.

Co znamená slovo statické?

Statičnost

  • = neměnné, stále
  • v programování jsou statické věci nevázané
  • v C# máme statické:
    • vlastnosti
    • metody
    • (třídy)
  • používáme static

Statické vlastnosti a metody nejsou vázané na instanci (objekt) ale na třídu. K přístupu používáme jméno třídy.

Statické vlastnosti

Statické metody

TENTO KÓD JE ŠPATNĚ. PROČ?

Statické třídy

  • označujeme static
  • nelze z nich vytvořit instance
  • nad rámec toho předmětu

Neviděli jsme ještě před touto hodinou někde něco statického?

K čemu se statické vlastnosti a metody hodí?

Může existovat privátní statická vlastnost?

Statičnost

Práce

Vymyslete program, ve kterém použijete statické vlastnosti a (nebo) metody.

Struktury

TBD

Výčtové typy

TBD

Děkuji za pozornost!

  • matej.cajthaml@ssps.cz
  • https://ssps.cajthaml.eu/