Doporučená, 2021

Redakce Choice

Rozdíl mezi rozhraním a abstraktní třídou v jazyce Java & C #

Třída rozhraní a abstrakt přispívají k „neúplnému typu“ v OOP. Někdy potřebujeme nadtřídu, abychom definovali „co dělat“, ale ne „jak to udělat“, je to způsob, jak dělat část bude implementována odvozenou třídou podle její potřeby, „ rozhraní “ to vyřeší. Někdy potřebujeme třídu nadtřídy, která definuje nějakou zobecněnou strukturu, kterou lze implementovat odvozenými třídami a určitou specifickou strukturu, kterou lze použít odvozenými třídami, „ abstraktní třída “ poskytuje řešení tohoto problému. Základní rozdíl mezi rozhraním a abstraktní třídou je, že rozhraní je zcela neúplné a abstraktní třída je částečně neúplná.

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".
MetodyRozhraní obsahuje pouze abstraktní metody.Abstraktní třída obsahuje abstraktní metody i konkrétní metody.
Modifikátor přístupu k metodámMetody 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 metodyMetoda 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ýmAcess 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ýchPromě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é blokyUvnitř rozhraní nelze deklarovat instanci ani statický blok.Abstraktní třída umožňuje instanci nebo statický blok uvnitř.
KonstruktoryV 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í“.

Rozhraní je čistě abstraktní třída. Klíčové slovo použité k vytvoření rozhraní je „interface“. Jak všechny metody uvnitř rozhraní jsou plně abstraktní. Rozhraní určuje pouze to, co musí třída dělat, ale nedefinuje, jak to dělá. Jen proto, že všechny metody deklarované uvnitř rozhraní jsou abstraktní, pro rozhraní není vytvořena žádná instance. Obecná forma „rozhraní“ v javě je:

 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 #

  1. 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.
  2. Rozhraní má všechny své metody abstraktní, ale abstraktní třída má některé abstraktní metody a některé konkrétní metody.
  3. 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.
  4. 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.
  5. 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é.
  6. 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é.
  7. Proměnná rozhraní musí být inicializována během deklarace. Na druhou stranu lze proměnné v abstraktní třídě kdykoliv inicializovat.
  8. Uvnitř rozhraní nelze deklarovat instanci nebo statický blok, ale můžete deklarovat instanci nebo statický blok uvnitř abstraktní třídy.
  9. 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.

Top