Programování

Kdy použít abstraktní třídu vs. rozhraní v C #

Při navrhování aplikací je důležité vědět, kdy použít abstraktní třídu a kdy použít rozhraní. Ačkoli se abstraktní třídy a rozhraní v některých ohledech zdají podobné, existují klíčové rozdíly, které určí, která je nejlepší volbou pro to, čeho se snažíte dosáhnout. V tomto příspěvku na blogu budu diskutovat o těchto rozdílech a o tom, jak se rozhodnout, kdy které použít.

Krátká odpověď: Abstraktní třída vám umožňuje vytvářet funkce, které mohou podtřídy implementovat nebo přepsat. Rozhraní umožňuje pouze definovat funkčnost, nikoli ji implementovat. A zatímco třída může rozšířit pouze jednu abstraktní třídu, může využívat výhod více rozhraní.

C # abstraktní třída vysvětlena

Abstraktní třída je speciální typ třídy, který nelze vytvořit instanci. Abstraktní třída je navržena tak, aby byla zděděna podtřídami, které buď implementují nebo přepisují její metody. Jinými slovy, abstraktní třídy jsou buď částečně implementovány, nebo nejsou implementovány vůbec. Ve své abstraktní třídě můžete mít funkčnost - metody v abstraktní třídě mohou být abstraktní i konkrétní. Abstraktní třída může mít konstruktory - to je jeden hlavní rozdíl mezi abstraktní třídou a rozhraním. Můžete využít výhod abstraktních tříd k návrhu komponent a určit určitou úroveň běžných funkcí, které musí být implementovány odvozenými třídami.

Vysvětlení rozhraní C #

Rozhraní je v zásadě smlouva - nemá žádnou implementaci. Rozhraní může obsahovat pouze deklarace metod; nemůže obsahovat definice metod. V rozhraní také nemůžete mít žádná členská data. Zatímco abstraktní třída může obsahovat definice metod, pole a konstruktory, rozhraní může mít pouze deklarace událostí, metod a vlastností. Metody deklarované v rozhraní musí být implementovány třídami, které implementují rozhraní. Všimněte si, že třída může implementovat více než jedno rozhraní, ale rozšiřuje pouze jednu třídu. Třída, která implementuje rozhraní, by měla implementovat všechny své členy. Stejně jako abstraktní třídu nelze vytvořit instanci rozhraní.

Mám použít abstraktní třídu nebo rozhraní?

Abstraktní třídy vám poskytují flexibilitu, abyste měli určité konkrétní metody a některé další metody, které by odvozené třídy měly implementovat. Naproti tomu, pokud používáte rozhraní, budete muset implementovat všechny metody ve třídě, která rozšiřuje rozhraní. Abstraktní třída je dobrá volba, pokud máte plány na budoucí expanzi - tj. Pokud je pravděpodobné, že v hierarchii tříd bude budoucí expanze. Pokud byste chtěli poskytnout podporu pro budoucí rozšíření při používání rozhraní, budete muset toto rozhraní rozšířit a vytvořit nové.

V jiné poznámce je snadné v případě potřeby přidat do hierarchie nové rozhraní. Pokud však ve své hierarchii již máte abstraktní třídu, nemůžete přidat další - tj. Můžete přidat abstraktní třídu, pouze pokud žádná není k dispozici. Měli byste použít rozhraní, pokud chcete smlouvu o nějakém chování nebo funkčnosti. Pokud potřebujete napsat stejný kód pro metody rozhraní, neměli byste používat rozhraní. V tomto případě byste měli použít abstraktní třídu, definovat metodu jednou a podle potřeby ji znovu použít. Použijte rozhraní k oddělení kódu vaší aplikace od konkrétních implementací této aplikace nebo k omezení přístupu na členy určitého typu.

Jak uvádí dokumentace k rozhraní společnosti Microsoft:

Pomocí rozhraní můžete například zahrnout chování z více zdrojů do třídy. Tato funkce je v C # důležitá, protože jazyk nepodporuje vícenásobné dědění tříd. Kromě toho musíte použít rozhraní, pokud chcete simulovat dědičnost struktur, protože ve skutečnosti nemohou dědit z jiné struktury nebo třídy.

Implicitní a explicitní implementace rozhraní

Rozhraní lze implementovat implicitně nebo explicitně. Vysvětlím, jak se tyto dvě implementace liší. Zvažte rozhraní s názvem IBusinessLogic.

veřejné rozhraní IBusinessLogic

{

void Initialize ();

}

Následující třída s názvem Obchodní logika realizuje IBusinessLogic rozhraní.

veřejná třída BusinessLogic: IBusinessLogic

{

public void Initialize ()

   {

// Nějaký kód

   }

}

Můžete vytvořit instanci souboru Obchodní logika třídy výslovně a poté zavolat Inicializovat () metoda, jak je uvedeno níže.

 IBusinessLogic businessLogic = nový BusinessLogic ();

businessLogic.Initialize ();

Následující fragment kódu ukazuje, jak můžete implementovat IBusinessLogic rozhraní implicitně.

veřejná třída BusinessLogic: IBusinessLogic

{

void IBusinessLogic.Initialize ()

   {

   }

}

Nyní můžete vyvolat Inicializovat () metoda stejným způsobem s použitím odkazu na IBusinessLogic rozhraní. Rozdíl ve dvou přístupech spočívá v tom, že když implementujete rozhraní výslovně ve své třídě, máte omezené vyvolání metody vašeho rozhraní pouze pomocí odkazu na rozhraní. Následující fragment kódu by proto nefungoval, tj. Nebyl by kompilován.

 BusinessLogic businessLogic = nový BusinessLogic ();

businessLogic.Initialize ();

Jak udělat více v C #:

  • Kdy použít abstraktní třídu vs. rozhraní v C #
  • Jak pracovat s AutoMapperem v C #
  • Jak používat výrazy lambda v C #
  • Jak pracovat s delegáty Action, Func a Predicate v C #
  • Jak pracovat s delegáty v C #
  • Jak implementovat jednoduchý záznamník v C #
  • Jak pracovat s atributy v C #
  • Jak pracovat s log4net v C #
  • Jak implementovat vzor návrhu úložiště v C #
  • Jak pracovat s odrazem v C #
  • Jak pracovat se souborovým systémem v C #
  • Jak provést línou inicializaci v C #
  • Jak pracovat s MSMQ v C #
  • Jak pracovat s metodami rozšíření v C #
  • Jak na nás lambda výrazy v C #
  • Kdy použít volatilní klíčové slovo v C #
  • Jak používat klíčové slovo výnos v C #
  • Jak implementovat polymorfismus v C #
  • Jak vytvořit svůj vlastní plánovač úloh v C #
  • Jak pracovat s RabbitMQ v C #
  • Jak pracovat s n-ticí v C #
  • Zkoumání virtuálních a abstraktních metod v C #