Srovnávací graf
Základ pro porovnání | Rozhraní | Abstraktní třída |
---|---|---|
Základní | Pokud máte pouze znalosti o požadavcích, ne o jeho implementaci, použijte "Rozhraní". | Když částečně víte o implementacích, používáte "Abstraktní třídy". |
Metody | Rozhraní obsahuje pouze abstraktní metody. | Abstraktní třída obsahuje abstraktní metody i konkrétní metody. |
Modifikátor přístupu k metodám | Metody rozhraní jsou vždy "Veřejné" a "Abstrakt", i když to neoznámíme. Lze tedy říci jako 100%, čistě abstraktní třídu. | Není povinné, aby metoda v abstraktní třídě byla veřejná a abstraktní. Může mít i konkrétní metody. |
Omezený modifikátor pro metody | Metoda rozhraní nemůže být deklarována s následujícími modifikátory: Veřejné: Soukromé a Chráněné Anotace: finální, statická, synchronizovaná, nativní, strictfp. | Modifikátory proměnné abstraktní třídy neexistují žádná omezení. |
Modifikátor přístupu k proměnným | Acess Modifier povolený pro Interface proměnné jsou veřejné, statické a konečné, ať už deklarujeme nebo ne. | Proměnné v abstraktní třídě nemusí být veřejné, statické, konečné. |
Omezené modifikátory pro proměnné | Proměnné rozhraní nelze deklarovat jako soukromé, chráněné, přechodné, volatilní. | Modifikátory proměnných abstraktní třídy neexistují. |
Inicializace proměnných | Proměnné rozhraní musí být inicializovány v okamžiku deklarace. | Není povinné, aby proměnné abstraktní třídy byly inicializovány v době jejího deklarace. |
Instance a statické bloky | Uvnitř rozhraní nelze deklarovat instanci ani statický blok. | Abstraktní třída umožňuje instanci nebo statický blok uvnitř. |
Konstruktory | V rámci rozhraní nelze deklarovat konstruktor. | Konstruktor můžete deklarovat uvnitř abstraktní třídy. |
Definice rozhraní
Java neumožňuje vícenásobné dědictví. To znamená, že jediná třída nemůže zdědit více než jednu třídu najednou. Důvodem toho lze vysvětlit příkladem. Předpokládejme, že máme dvě nadřazené třídy A a B a odvozenou třídu C. Odvozená třída C dědí obě třídy A i B. Nyní mají obě třídy A a B metodu (), pak to bude otázka pro třídu C, která metoda třídy set () by měla zdědit. Řešením tohoto problému je „rozhraní“.
access_specifier interface_name {return-type method-name1 (seznam parametrů); return-type method-name2 (seznam parametrů); typ final-varname1 = hodnota; typ final-varname2 = hodnota; // ... return-type method-nameN (seznam parametrů); typ final-varnameN = hodnota; }
Specifikátor přístupu je deklarován jako veřejný, protože třídy musí implementovat rozhraní.
Nemáme koncept „rozhraní“ v C ++. Ale Java a C # definují rozhraní velmi dobře.
Rozhraní v jazyce Java:
- Proměnné rozhraní jsou standardně vždy veřejné, statické a konečné.
- Proměnné musí být inicializovány v době jeho prohlášení.
- Proměnné nelze nikdy deklarovat jako soukromé, chráněné, přechodné a nestálé.
- Metody rozhraní jsou vždy veřejné a abstraktní, zatímco nikdy nemohou být deklarovány jako soukromé, chráněné, konečné, statické, synchronizované, nativní a přísné.
- Nemůžete deklarovat žádný konstruktor uvnitř rozhraní, protože hlavním účelem konstruktoru je inicializace třídních proměnných, ale v proměnných rozhraní jsou inicializovány v době jeho deklarace.
- Rozhraní může zdědit jiná rozhraní, ale třída implementující takové rozhraní musí implementovat metody všech zděděných rozhraní.
- Třída může zdědit více než jedno rozhraní najednou a musí implementovat všechny metody všech zděděných rozhraní.
Obecná forma implementace rozhraní v jazyce Java:
třída class_name implementuje Interface_name {// class-body}
Pro zdědění rozhraní používá třída klíčové slovo „implementace“ a třída implementuje veškerou metodu deklarovanou zděděným rozhraním.
Rozhraní v jazyce C #:
Rozhraní v C # je téměř podobné rozhraní v Javě kromě:
- Rozhraní v C # neuvádí proměnné.
- Název rozhraní je předponován hlavním písmenem I a je zděděn znakem dvojtečky (:).
Obecná forma implementace rozhraní v C #:
třída class_name: interface_name {// class-body}
Definice abstraktní třídy
Třída, která obsahuje jednu nebo více abstraktních metod, se nazývá abstraktní třída a třída je deklarována jako abstraktní pomocí klíčového slova „abstrakt“, kterému na začátku prohlášení třídy předchází klíčové slovo „třída“. Protože abstraktní třída obsahuje abstraktní metodu, představuje neúplný typ. Proto nemůžete vytvářet objekty abstraktní třídy. Kdykoliv třída zdědí abstraktní třídu, musí implementovat všechny abstraktní metody abstraktní třídy, pokud to pak neznamená, musí být také deklarováno jako abstract.The abstraktní atribut je zděděn, dokud není dosaženo úplné realizace abstraktních metod.
Abstraktní třída může také obsahovat konkrétní metody, které mohou být odvozenou třídou využity. V abstraktní třídě však nelze deklarovat abstraktní konstruktor nebo abstraktní statickou metodu. Obecná forma abstraktní třídy v jazyce Java je následující:
abstraktní třída class_name {abstract method_name1 (); abstrakt method_name2 (); : return_type method_name3 (parametr_list) {// konkrétní metoda} return_type method_name4 (parametr_list) {// konkrétní metoda}};
Koncept abstraktní třídy je podobný jak v jazyce Java, tak v jazyce C #. Abstrakt třídy je v jazyce C ++ poněkud odlišný.
V případě, že třída má alespoň jednu virtuální funkci, třída se stává abstraktní třídou. Namísto klíčového slova „abstrakt“ se klíčové slovo „virtuální“ používá k deklaraci abstraktní metody.
Klíčové rozdíly mezi rozhraním a abstraktní třídou v jazyce Java a C #
- Pokud máte znalosti o „co je požadováno“, ale ne o tom, „jak by bylo implementováno“, pak musí být použito rozhraní. Na druhou stranu, pokud víte, co je požadováno a částečně víte, jak by bylo implementováno, pak použijte abstraktní třídu.
- Rozhraní má všechny své metody abstraktní, ale abstraktní třída má některé abstraktní metody a některé konkrétní metody.
- Metody uvnitř rozhraní jsou veřejné a abstraktní, proto se také nazývá čistě abstraktní třídou. Metody uvnitř abstraktu však nejsou omezeny pouze na veřejnost a abstrakt.
- Metoda rozhraní nemůže být nikdy soukromá, chráněná, konečná, statická, synchronizovaná, nativní nebo přísná. Na druhou stranu neexistují žádná omezení metod abstraktní třídy.
- Proměnné v rozhraní jsou veřejné a konečné, zda je deklarujeme, nebo ne, zatímco takovéto omezení na proměnné abstraktní třídy není veřejné a konečné.
- Proměnné v rozhraní nemohou být nikdy chráněny přechodně nebo volatile soukromě, zatímco v abstraktní třídě neexistuje žádné omezení na proměnné.
- Proměnná rozhraní musí být inicializována během deklarace. Na druhou stranu lze proměnné v abstraktní třídě kdykoliv inicializovat.
- Uvnitř rozhraní nelze deklarovat instanci nebo statický blok, ale můžete deklarovat instanci nebo statický blok uvnitř abstraktní třídy.
- Konstruktor nelze definovat uvnitř rozhraní, zatímco konstruktor lze definovat uvnitř abstraktní třídy.
Závěr:
Když potřebujete vytvořit základní třídu, která obsahuje zobecněnou formu metod, které mohou být implementovány odvozenými třídami podle jejich potřeby, v tomto případě pomáhá koncepce rozhraní a abstraktní třídy.