1.3.2. Abstraktní třídy a rozhraní

Možná máte oprávněný pocit, že na Obr. 1.8 není vše v pořádku. Toto schéma zavádí hierarchii mezi zákazníky, ve které je firemní zákazník na jiné úrovni než fyzická osoba, která by měla být přímo instancí třídy Zákazník. To ovšem neodpovídá realitě, zákazník je obecným pojmem, který existuje ve dvou konkrétních podobách, a to jako firma nebo jako fyzická osoba. Proto zavedeme pro fyzickou osobu samostatnou třídu, která nebude k třídě Zákazník přidávat žádné nové vlastnosti, pouze umožní vytvářet instance fyzických osob na stejné úrovni hierarchie jako firmy.

Obrázek 1.9. Abstraktní bázová třída

Třída Zákazník se po této úpravě stane abstraktní třídou, která nebude mít žádné konkrétní instance. V grafickém vyjádření použijeme pro jméno takové abstraktní třídy kurzívu - viz Obr. 1.9.

S abstraktními třídami souvisí ještě další pojem. Dejme tomu, že bychom chtěli zajistit tisk adresáře našich zákazníků. To můžeme realizovat například operací tisk(), kterou umístíme nejlépe do třídy Zákazník a o které budeme předpokládat, že ji implementují konkrétní následníci třídy Zákazník. Jestliže operace některé třídy postrádá implementaci, pak ji označujeme za abstraktní operaci a v grafickém vyjádření její jméno uvedeme kurzívou, stejně jako jsme to dělali u abstraktních tříd.

Obrázek 1.10. Abstraktní operace tisk() a její implementace

Je zřejmé, že obsahuje-li některá třída alespoň jednu abstraktní operaci, pak musí být celá třída abstraktní, neboť nemůžeme vytvořit instanci třídy, které by chyběla implementace nějaké operace.