23.11.2021, Vladimír Klaus, navštíveno 1764x
Abstraktní třídy nejsou nic složitého či záhadného, ale je třeba dobře porozumět principům, kterými se řídí a vědět, kdy a proč je použít. Chce to trochu více přemýšlení při tvorbě objektového návrhu, ale rozhodně se to vyplatí. A pokud ještě navíc přecházíte mezi programovacími jazyky, je to občas náročné, protože jazyky jsou si sice hodně podobné, ale ne stejné. Proto vznikl tento krátký článek, jako malé shrnutí či tahák.
Abstraktní třída nebo funkce či metoda je pouze jakási kostra, definice. Nemá žádnou implementaci, tu musí zajistit až následník.
V Delphi je třeba (v případě funkce) ještě přidat direktivu "virtual", což obecně znamená, že je možné funkci v následníkovi přepsat. No a v případě abstraktní metody to je tak nějak nutné, že? A v následníkovi se pak funkce musí vylepšit o direktivu "override", čímž říkáme, že přepisujeme virtuální metodu předka. Pozor, neplést s direktivou "overload"!
TGrafickaAplikace = class abstract
public
function ZjistiCestuKAplikaci: string; virtual; abstract;
end;
TGrafickaAplikacePhotoshop = class (TGrafickaAplikace)
public
function ZjistiCestuKAplikaci: string; override;
end;
function TGrafickaAplikacePhotoshop.ZjistiCestuKAplikaci: string;
begin
//již konkrétní implementace funkce
end;
V C# je abstraktní třída či metoda označena jen pomocí "abstract". V mém případě přímý následník je opět abstraktní třída a reálnou implementaci bude zajišťovat až další následník. I zde je třeba u metody uvést "override".
public abstract class CteniDat : DataManager {
public abstract bool PripravData();
}
public abstract class CteniDatLide : CteniDat {
//nic, co by souviselo s přípravou dat, to řeší až další následník...
//takže metoda PripravData() zde není ani nijak uvedena
}
public class CteniDatLideDeti : CteniDatLide {
public override bool PripravData() {
//již konkrétní implementace metody
}
}
V Delphi je možné (bohužel) založit objekt typu abstraktní třídy. V C# to možné není a objekty tak mohou být vytvořeny až z následných tříd (pokud opět nejsou abstraktní).
Vše se dále zesložití, pokud do dědění vstupují "interfacy", případně dokonce vícenásobné. Ale to už nepatří do tohoto základního pojednání. A rozhodně doporučuji prohlédnout příklady v části Zdroje, kde je vše vysvětleno na pěkných příkladech!
Zcela samostatnou kapitolou pak je, kam takové funkce/metody patří. Máme tu spoustu klíčových slov označující viditelnost či možnost dědění, jako je protected, published, internal, private, strict private apod. Pokud se ale problematiku teprve učíte, nekomplikujte si tímto život a mějte vše vedené jako public. Až vše lépe pochopíte, a hlavně vám to bude fungovat, můžete se začít zabývat "skrýváním".
Zdroje: