Třída vs Interface

hlasů
2

Nedávno jsem byl požádán, v rozhovoru, který může rozhraní lze považovat za třídy v C #? Tj je rozhraní je třída v C #?

Byl jsem zmatený.

Co může být odpověď?

Položena 27/08/2009 v 02:31
zdroj uživatelem
V jiných jazycích...                            


7 odpovědí

hlasů
8

Ne, rozhraní není třídou.

Rozhraní je soubor metod podpisů a možná i pozemky, které se všechny týkají jediné myšlence. Například IList rozhraní bude mít metody pro indexování, vkládání a získávání počet prvků. Nicméně, to nedefinuje žádné podrobnosti implementace. Rozhraní seznam by mohl být realizován jako spojový seznam, nebo zabalené do pole, nebo cokoliv chcete, tak dlouho, jak to definuje tyto metody v rozhraní.

Třída je šablona, ​​ze které pro vytvoření skutečné objekt. Třídy jsou sbírka metody podpisů, plus implementace těchto metod.

Takže ne, rozhraní není třída, neboť pouze stanoví zvláštní smlouvu, zatímco třída definuje celou chování objektu.

Komentátor SquareCog přesně poukazuje na to, že výše uvedené není tak úplně pravda. Vzhledem k tomu, třídy mohou být podtřídou, a metody přepsána, třída vztah ke skutečnému chování objektu dostane o něco složitější. Já jsem prostě jít handwave ten problém daleko tím, že třídy jsou jednotlivé subjekty. Můžete si přečíst zdrojový kód pro třídu a vědí, jaké chování, že třída zahrnuje. Nicméně, v běhu, objekty mají typy namísto tříd. Typy jsou celá dědičnost strom, místo toho singulární třídy, a tak určitý typ chování by mohla být definována v průběhu několika různých tříd. Naštěstí to nemění základní koncepční rozdíl, který rozhraní jsou smlouvy, které s sebou může nést (přes jmen, typy argumentů, etc) některé implementace, ale nemůže nic ale metoda podpisy prosadit, zatímco třídy dělat definovat realizaci, i když to není skutečná realizace používá při běhu.

Odpovězeno 27/08/2009 v 02:37
zdroj uživatelem

hlasů
3

Z logického hlediska jsou velmi podobné. Jak již bylo uvedeno ostatními, ABC 1 pouze s veřejnými abstraktních členů by sloužil téměř stejný účel jako rozhraní.

Když se dostanete dolů na šrouby a matice z ní, dva mají řadu významných rozdílů.

  • Třída může jen dědit od jednoho základní třídy, ale může realizovat mnoho rozhraní.
  • Typ hodnoty, již vyplývají z ValueType, nemůže dědit z ABC, ale může implementovat rozhraní.
  • Třída může obsahovat pole a statické členy. Rozhraní nemůže.
  • Třída může obsahovat implementaci, rozhraní nemůže.
  • Třída může mít soukromé a chráněné členy, rozhraní nemůže.
  • Abstrakt členové ABC jsou vždy virtuální. Třída může implementovat rozhraní s non-virtuální členů.

1: Abstraktní základní třídy

Odpovězeno 27/08/2009 v 02:48
zdroj uživatelem

hlasů
2

Rozhraní Java není třídou; Je prohlášení o metodách, které musí být realizovány tříd; popis schopností, chcete-li. Abstraktní třídy v Javě jsou zajímavou půli cesty mezi bodem správné třídy a rozhraní, jak se vymezit dostupné metody, ale také poskytují některé výchozí implementace.

Zásadní rozdíl mezi abstraktní třídy a rozhraní v Javě je, že můžete rozšířit pouze jednu třídu; můžete implementovat více rozhraní. Abstraktní třída popisuje, co máte; rozhraní popisuje, co můžete udělat . To, co jste také definuje, co můžete udělat - ale má podstatně větší význam.

Odpovězeno 27/08/2009 v 02:36
zdroj uživatelem

hlasů
2

Ano, jakýkoliv abstraktní třída, která neobsahuje žádnou implementaci a skládá se z abstraktních metod, jen by odpovídalo rozhraní.

Odpovězeno 27/08/2009 v 02:34
zdroj uživatelem

hlasů
1

Obecně platí, že rozhraní je typu, který může být implementován třídy pro indikaci, že třída vystaví chování prostřednictvím řady metod. Například, Net má ICollectionrozhraní, které obsahuje metody k interakci s kolekcí.


V jazyce C ++, rozhraní je třída, kde každá metoda je abstraktní.

V Java a .NET, rozhraní jsou samostatné druhy, které nesouvisí s tříd.

Ať tak či onak, třídy mohou implementovat rozhraní.

Odpovězeno 27/08/2009 v 02:37
zdroj uživatelem

hlasů
1

Tam by mohlo být několik odpovědí.

Ne, třída není interface - rozhraní definuje kontrakt, třída je typ objektu, který může být vytvořen.

Ano, rozhraní lze považovat za základní třídy s pouze virtuální metody - to je to, jak jsou definovány rozhraní v jazyce C ++.

Odpovězeno 27/08/2009 v 02:34
zdroj uživatelem

hlasů
0

To je užitečné považovat .NET jak mít tři „bezpečných“ druhů typů v .NET: rozhraní, tříd a hodnotové typy (jsou zde i věci, jako ukazatele a tak, ale ty jsou jiný příběh) a tři hlavní kontexty tříd mohou použít: úložišť, halda objekty a generické vazby.

Halda objekty mohou být jakéhokoliv typu, ale všechny objekty haldy se chovají jako objekty třídy. Halda objekty typu rozhraní jsou vzácné; nejsou obecně vytvořeny v rámci .net, ale může být vytvořen podle kódu určeného pro práci se staršími modely objektů. Halda objekty typů tříd obsahovat jedno úložné místo pro každé pole; halda objekty typů hodnot obsahovat jedno místo uložení, jehož typ je typ hodnoty v otázce.

Sklady mohou rovněž být jakéhokoliv typu, ale paměťová místa hodnota typu se liší od ostatních. Úložné místo třídy typu nebo typu rozhraní uchovává odkaz třídy. Místo uložení hodnoty typu obsahuje buď hodnotu primitivní (byte, celé číslo, char, s plovoucí desetinnou čárkou čísla, atd), nebo také obsahuje místo uložení pro každé pole typu hodnoty (tak např umístění úložiště typu Pointdrží dvě skladovací místa typu Int32, z nichž každý drží podepsanou-32-bitové celé číslo primitivní).

Generické vazby mohou být také jakéhokoliv typu, ale omezení typů rozhraní neomezily pouze omezené parametr obecný typ sám jako typ třídy, typ interface, nebo typ hodnoty. Způsob deklarován void Foo<T>(T param) where T:IWowzomohl být volán s parametrem třídy typu, typu rozhraní, nebo typ hodnoty. Je-li rutina je volána s parametrem value-type, pak parami veškeré další úložná místa prokazatelně typu Tbudou uloženy jako typy hodnot. Pokud je volání rutiny s parametrem třídy typu nebo typu celé číslo pak parama jakýchkoli dalších úložných míst prohlášeny za typu Tbude uložena jako třída reference. Je důležité poznamenat, že v případě, Tje sama o sobě typ rozhraní ( IWozonebo jeho derivát), pak parambude předán jako odkaz na objekt haldy, a bude chovat jako jeden bez ohledu na to, zda typ instance objektu je objekt třídy nebo typ hodnoty. Pokud struct Barnářadí IWowzo, a myBarje proměnná typu Bar, volání Foo<Bar>(myBar)může vést k různým sémantiku z Foo<IWowzo>(myBar); V prvním případě bude parametr chovat jako typ hodnoty a ve druhém případě to bude chovat jako typ třídy.

Odpovězeno 09/07/2012 v 19:44
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more