Jak všichni víme, abstrakce se týká vnitřní implementace funkce a pouze zobrazení praktičnosti uživatelům. tj. co to funguje (zobrazeno, Rozhraní však nabízí úplnou abstrakci v Javě, kterou abstraktní kategorie neumí.
Abstraktní třída vs rozhraní
Hlavní rozdíl mezi abstraktní třídou a rozhraním je v tom, že přidružené rozhraní rozšíří pouze další rozhraní Java; přidružená abstraktní kategorie vytvoří další kategorii Java a implementuje více rozhraní Java. Členové rozhraní Java se ve výchozím nastavení veřejně liší. Abstraktní kategorie Java bude mít členy kategorie jako osobní, chráněné atd.
Abstraktní třída je třída, která má ve své deklaraci klíčové slovo abstract. V abstraktních třídách by měla být přítomna alespoň jedna abstraktní metoda, tj. metody bez těla. Může mít různé konkrétní metody.
Abstraktní třídy můžete použít ke generování plánů pro konkrétní třídy. Abstraktní metoda však musí být implementována dědící třídou.
Rozhraní je plán pro třídu, kterou lze použít k jejímu vytvoření. Rozhraní nemá žádné konkrétní metody (metody, které mají kód). Všechny metody rozhraní jsou abstraktní metody.
Není možné vytvořit rozhraní. Na druhé straně třídy, které implementují rozhraní, mohou být konkretizovány. Proměnné instance se v rozhraních nikdy nepoužívají. Lze však použít veřejné statické konečné proměnné (známé také jako proměnné konstantní třídy).
Co je abstraktní třída?
Abstraktní třída je základní koncept v objektově orientovaném programování (OOP), který slouží jako plán nebo šablona pro jiné třídy. Je to třída, která nemůže být konkretizována a je určena k rozšíření nebo podtřídě jinými třídami. Abstraktní třídy definují společné atributy a metody, které bude sdílet více příbuzných tříd v rámci hierarchie dědičnosti.
Mezi klíčové vlastnosti a vlastnosti abstraktních tříd patří:
- Nelze vytvořit instanci: Abstraktní třídu nelze použít k přímému vytváření objektů nebo instancí. Místo toho poskytuje rámec pro podtřídy, které mohou dědit a implementovat jeho vlastnosti a metody.
- Může obsahovat abstraktní metody: Abstraktní třídy zahrnují jednu nebo více abstraktních metod. Deklarace metod bez jakýchkoli podrobností o implementaci. Podtřídy musí poskytovat konkrétní implementace pro tyto abstraktní metody.
- Může obsahovat konkrétní metody: Abstraktní třídy mohou mít také konkrétní (plně implementované) metody, které mohou podtřídy zdědit. Tyto metody mohou poskytovat společné funkce sdílené všemi podtřídami.
- Používá se pro opětovné použití kódu: Abstraktní třídy podporují znovupoužitelnost kódu a princip DRY (Don't Repeat Yourself) tím, že umožňují definovat společný kód v jediné abstraktní třídě a sdílet jej mezi souvisejícími podtřídami.
- Dědictví: Podtřídy dědí atributy a metody definované v abstraktní třídě. To umožňuje specializaci a přizpůsobení chování při zachování společné struktury.
- Abstraktní vs. konkrétní třídy: Abstraktní třídy se liší od konkrétních tříd, které mohou být vytvořeny přímo. Konkrétní třídy poskytují úplné implementace pro všechny své metody.
V jazycích jako Java a C# klíčové slovo „abstract“ definuje abstraktní třídy. Abstraktní třídy jsou cennými nástroji pro vytváření hierarchií souvisejících tříd, které sdílejí společné vlastnosti a chování a zároveň umožňují přizpůsobení a specializaci v odvozených třídách.
Co je rozhraní?
Rozhraní je základní koncept v objektově orientovaném programování (OOP), který definuje smlouvu nebo sadu podpisů metod, které musí být implementovány jakoukoli třídou, která se drží rozhraní. Rozhraní poskytují způsob, jak dosáhnout vícenásobné dědičnosti v jazycích, které jej přímo nepodporují, a podporují abstrakci kódu, modularitu a flexibilitu.
Mezi klíčové vlastnosti a vlastnosti rozhraní patří:
- Podpisy metody: Rozhraní definuje kolekci podpisů metod bez podrobností o implementaci. Tyto podpisy metod představují sadu chování, které musí implementační třídy poskytovat.
- Smluvní závazek: Když třída implementuje rozhraní, musí poskytovat konkrétní implementace pro všechny metody definované v tomto rozhraní. Pokud tak neučiníte, dojde k chybě kompilace.
- Vícenásobná dědičnost: Na rozdíl od tříd, které podporují jedinou dědičnost (rozšíření jedné třídy), třída může implementovat více rozhraní. To umožňuje třídě dědit a poskytovat více sad chování.
- Abstrakce a polymorfismus: Rozhraní podporují abstrakci tím, že oddělují „co“ (podpisy metody) od „jak“ (implementace metod). Tato abstrakce umožňuje polymorfismus, kdy lze s objekty různých tříd implementující stejné rozhraní zacházet zaměnitelně.
- Znovupoužitelnost kódu: Rozhraní usnadňují opětovné použití kódu tím, že definují běžné chování, které mohou různé třídy implementovat. To podporuje princip DRY (Don't Repeat Yourself).
- Flexibilita: Rozhraní umožňují volně spojený kód tím, že umožňují zaměnitelnost tříd na základě rozhraní, která implementují. Tato flexibilita je užitečná zejména při navrhování modulárních a rozšiřitelných systémů.
Rozhraní jsou široce používána v jazycích jako Java, C# a TypeScript k definování a vynucování smluv mezi třídami a zajišťují, že dodržují specifikované API (Application Programming Interface) a sdílejí společné chování a zároveň umožňují různé implementace.
Srovnávací tabulka mezi abstraktní třídou a rozhraním
Parametry diferenciace | Abstraktní třída | Rozhraní |
---|---|---|
Instanciace | Nelze vytvořit instanci přímo. | Nelze jej vytvořit přímo. |
Účel | Slouží jako plán pro ostatní třídy a může poskytnout obě deklarace metod s implementací nebo bez ní. | Nelze jej vytvořit přímo. |
Metody | Může mít abstraktní (neimplementované) metody, konkrétní (implementované) metody nebo kombinaci obou. | Obsahuje pouze podpisy metod bez jakýchkoli implementací; všechny metody jsou implicitně abstraktní. |
Vícenásobné dědictví | Podporuje jedinou dědičnost; třída může rozšířit pouze jednu abstraktní třídu. | Podporuje vícenásobnou dědičnost; třída může implementovat více rozhraní. |
Konstruktory | Může mít konstruktory, které jsou vyvolány při vytvoření instance podtřídy. | Nemůže mít konstruktory, protože nemohou být vytvořeny přímo. |
Znovupoužitelnost kódu | Podporuje opětovnou použitelnost kódu tím, že umožňuje sdílení společného kódu mezi souvisejícími třídami. | Podporuje opětovnou použitelnost kódu tím, že definuje společné sady chování, které musí třídy implementovat. |
Flexibilita | Nabízí rovnováhu mezi abstrakcí a poskytováním běžných funkcí. | Klade důraz na abstrakci a specifikaci smlouvy. |
Případy užití | Užitečné pro vytváření hierarchií souvisejících tříd se sdíleným chováním a atributy. | Užitečné pro definování smluv, které zajišťují, že implementační třídy poskytují specifické chování. |
Příklad | abstract class Shape { abstract double area(); } | interface Drawable { void draw(); } |
Scénář | Užitečné, když chcete poskytnout společnou základní třídu s určitým výchozím chováním, ale ponechat konkrétní metody, které mají být implementovány podtřídami. | Užitečné, když chcete definovat smlouvu nebo sdílenou sadu chování napříč více třídami, aniž byste museli diktovat společnou základní třídu. |
Hlavní rozdíly mezi Abstraktní třída a rozhraní
Abstraktní třída:
- Může mít jak abstraktní (neimplementované), tak konkrétní (implementované) metody.
- Podporuje jedinou dědičnost, což znamená, že třída může rozšířit pouze jednu abstraktní třídu.
- Může mít konstruktory pro inicializaci stavů objektů.
- Umožňuje vytvoření základní třídy s výchozím chováním.
- Poskytuje rovnováhu mezi abstrakcí a běžnou funkčností.
- Užitečné při vytváření hierarchií souvisejících tříd se sdílenými atributy a chováním.
rozhraní:
- Obsahuje pouze podpisy metod bez jakýchkoli implementací; všechny metody jsou implicitně abstraktní.
- Podporuje vícenásobnou dědičnost, což znamená, že třída může implementovat více rozhraní.
- Nemůže mít konstruktory, protože rozhraní nelze konkretizovat.
- Definuje smlouvu specifikující sadu metod, které musí implementační třídy poskytovat.
- Zdůrazňuje abstrakci a specifikaci sdílené sady chování.
- Užitečné pro definování smluv a zajištění toho, aby třídy dodržovaly specifické požadavky API.
Proč investovat do čističky vzduchu?
Abstraktní třída vám umožňuje vytvářet funkce, které mohou podtřídy implementovat nebo přepsat, zatímco rozhraní vám umožňuje uvést, ale neimplementovat funkce. Zatímco třída může rozšířit pouze jednu abstraktní třídu, může implementovat několik rozhraní.