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

Autor: Laura McKinney
Datum Vytvoření: 1 Duben 2021
Datum Aktualizace: 8 Smět 2024
Anonim
Rozdíl mezi rozhraním a abstraktní třídou v jazyce Java a C # - Technologie
Rozdíl mezi rozhraním a abstraktní třídou v jazyce Java a C # - Technologie

Obsah


Rozhraní i třída abstrakt přispívají k „neúplnému typu“ v OOP. Někdy potřebujeme nadřazenou třídu, abychom mohli definovat „co dělat“, ale ne „jak dělat“, je to, jak dělat část, podle odvozené třídy implementuje odvozená třída, “rozhraní”Poskytnout řešení. Někdy potřebujeme třídu superclass, která definuje nějakou zobecněnou strukturu, kterou lze implementovat odvozenými třídami, a nějakou specifikovanou strukturu, kterou mohou odvozené třídy využít,abstraktní třída”Poskytuje řešení tohoto problému. Základní rozdíl mezi rozhraním a abstraktní třídou spočívá v tom, že rozhraní je zcela neúplné a abstraktní třída je částečně neúplná.

  1. Srovnávací tabulka
  2. Definice
  3. Klíčové rozdíly
  4. Závěr

Srovnávací tabulka

Základ pro srovnáníRozhraníAbstraktní třída
ZákladníPokud znáte pouze požadavky na jeho implementaci, použijete „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.
Přístup modifikátor metodMetody rozhraní jsou vždy „veřejné“ a „abstraktní“, i když to nehlásíme. Lze tedy říci, že je to 100%, čistě abstraktní třída.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 metodyMetodu rozhraní nelze deklarovat pomocí následujících modifikátorů:
Veřejné: soukromé a chráněné
Abstrakt: final, static, synchronized, native, strictfp.
Pro modifikátory abstraktní proměnné třídy neexistují žádná omezení.
Přístup k modifikátoru proměnnýchModifikátor přístupu povolený pro proměnné rozhraní jsou veřejné, statické a konečné, ať už se hlásíme nebo ne.Proměnné v abstraktní třídě nemusí být veřejné, statické, konečné.
Omezené modifikátory proměnnýchProměnné rozhraní nelze deklarovat jako soukromé, chráněné, přechodné, těkavé.Neexistuje žádné omezení modifikátorů abstraktních proměnných třídy.
Inicializace proměnnýchProměnné rozhraní musí být inicializovány v době jeho deklarace.Není povinné, aby abstraktní proměnné třídy byly inicializovány v době jeho deklarace.
Instance a statické blokyUvnitř rozhraní nemůžete deklarovat instanci nebo statický blok.Abstraktní třída umožňuje uvnitř ní instanci nebo statický blok.
KonstruktoryV rozhraní nelze deklarovat konstruktor.Konstruktora můžete deklarovat uvnitř abstraktní třídy.


Definice rozhraní

Java neumožňuje vícenásobné dědictví. To znamená, že jedna třída nemůže zdědit více než jednu třídu najednou. Důvod za tím 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í oba třídy A a B metodu set (), pak bude pro třídu C otázkou, kterou metodu set () třídy 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 „rozhraní“. Protože všechny metody uvnitř rozhraní jsou zcela abstraktní. Rozhraní specifikuje pouze to, co třída musí udělat, ale nedefinuje, jak to dělá. Protože všechny metody deklarované uvnitř rozhraní jsou abstraktní, pro rozhraní se nevytvoří žádná instance. Obecná forma „rozhraní“ v java je:


access_specifier rozhraní interface_name {return-type method-name1 (seznam parametrů); return-type method-name2 (seznam parametrů); type final-varname1 = value; type final-varname2 = value; // ... návrat-type method-nameN (seznam parametrů); type final-varnameN = value; }

Specifikátor přístupu je prohlášen za veřejný, protože třídy musí implementovat rozhraní.

V C ++ nemáme koncept „Interface“. Java a C # však rozhraní definují velmi dobře.

Rozhraní v Javě:

  • Proměnné rozhraní jsou ve výchozím nastavení vždy veřejné, statické a konečné.
  • Proměnné musí být inicializovány v okamžiku jejího prohlášení.
  • Proměnné nelze nikdy prohlásit za soukromé, chráněné, přechodné a proměnlivé.
  • 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 strictfp.
  • Uvnitř rozhraní nemůžete deklarovat žádný konstruktor, protože hlavním účelem konstruktoru je inicializace proměnných třídy, ale proměnné 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 Javě:

class class_name implementuje Interface_name {// class-body}

Pro zdědění rozhraní třída používá klíčové slovo „implementuje“ a třída implementuje veškerou metodu deklarovanou zděděným rozhraním.

Rozhraní v C #:

Rozhraní v C # je téměř podobné rozhraní v Javě s výjimkou:

  • Rozhraní v C # ne deklaruje proměnné.
  • Název rozhraní je označen velkým písmenem I a je zděděn dvojtečkou (:).

Obecná forma implementace rozhraní v C #:

class 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“, před kterým je klíčové slovo „class“ na začátku deklarace třídy. Protože abstraktní třída obsahuje abstraktní metodu, představuje neúplný typ. Proto nemůžete vytvářet objekty abstraktní třídy. Kdykoli třída zdědí abstraktní třídu, musí implementovat všechny abstraktní metody abstraktní třídy, pokud tomu tak není, musí být také deklarována jako abstraktní. Abstraktní atribut je zděděn, dokud není dosaženo úplné implementace abstraktních metod.

Abstraktní třída může také obsahovat konkrétní metody, které lze odvozenou třídou použít tak, jak jsou. V abstraktní třídě však nemůžete deklarovat abstraktní konstruktor nebo abstraktní statickou metodu. Obecná podoba abstraktní třídy v Javě je následující:

abstract class class_name {abstract method_name1 (); abstract 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 #. Abstraktní třída se v C ++ mírně liší.

V případě třídy C ++, pokud má třída alespoň jednu virtuální funkci, se třída stává abstraktní třídou. Místo klíčového slova „abstraktní“ se pro deklaraci abstraktní metody používá klíčové slovo „virtuální“.

  1. Pokud máte znalosti o tom, „co je požadováno“, ale nikoli o tom, „jak by bylo implementováno“, musíte použít rozhraní. Na druhou stranu, pokud víte, co je potřeba a částečně víte, jak by byla implementována, použijte abstraktní třídu.
  2. Rozhraní má všechny své metody abstraktní, ale abstraktní třída má nějaké 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. Na druhé straně metody uvnitř abstraktu nejsou omezeny pouze na veřejné a abstraktní.
  4. Metoda rozhraní nemůže být nikdy soukromá, chráněná, konečná, statická, synchronizovaná, nativní nebo přísná. Na druhé straně neexistují žádná omezení pro metody abstraktní třídy.
  5. Proměnné v rozhraní jsou veřejné a konečné, ať už je deklarujeme nebo ne, zatímco takové omezení proměnných abstraktní třídy není veřejné a konečné.
  6. Proměnné v rozhraní nikdy nemohou být soukromé chráněné přechodné nebo nestálé, zatímco v abstraktní třídě neexistuje omezení na proměnné.
  7. Proměnná rozhraní musí být inicializována během deklarace. Na druhé straně mohou být proměnné v abstraktní třídě kdykoli inicializovány.
  8. Uvnitř rozhraní nelze deklarovat instanci nebo statický blok, ale můžete deklarovat instanci nebo statický blok uvnitř abstraktní třídy.
  9. V rozhraní nelze definovat konstruktor, zatímco v abstraktní třídě můžete konstruktor definovat.

Závěr:

Pokud potřebujete vytvořit základní třídu, která obsahuje zobecněnou formu metod, které mohou odvozené třídy implementovat podle jejich potřeby, pomáhá při tom koncept rozhraní a abstraktní třídy.