Sąsaja prieš abstrakčią klasę (bendras OO)

Neseniai aš turėjau dvi pokalbius telefonu, kai man buvo klausiama apie skirtumus tarp sąsajos ir abstrakčios klasės. Aš paaiškinau visus aspektus, apie kuriuos galėjau galvoti, bet jie, atrodo, laukia, kol pasakysiu kažką konkretaus, ir aš nežinau, kas tai yra.

Mano patirtimi manau, kad tai yra. Jei turiu trūkstamą tašką, praneškite man.

Sąsaja:

Kiekvienas sąsajoje deklaruotas metodas turi būti įgyvendintas poklasyje. Sąsajoje gali egzistuoti tik įvykiai, delegatai, savybės (С #) ir metodai. Klasė gali įgyvendinti kelias sąsajas.

Anotacija klasė:

Poklasis turi atlikti tik abstrakčius metodus. Anotacija klasė gali turėti įprastų metodų su įgyvendinimais. Abstrakta klasė taip pat gali turėti klasių kintamuosius šalia įvykių, delegatų, savybių ir metodų. Klasė gali įgyvendinti tik vieną abstrakčią klasę tik dėl to, kad C # nėra daugkartinio paveldėjimo.

  • Po to apklausėjas iškėlė klausimą „Ką daryti, jei turėtumėte abstrakčių klasių su abstrakčiais metodais? Aš nežinojau atsakymo, bet manau, kad šis paveldėjimas, kaip nurodyta pirmiau, yra teisingas?

  • Kitas interviu paklausė manęs, kas, jei sąsajoje būtų viešas kintamasis, kaip tai skiriasi nuo abstrakčios klasės? Pritariau, kad sąsajoje negalite turėti viešojo kintamojo. Aš nežinojau, ką jis norėjo išgirsti, bet jis taip pat nebuvo patenkintas.

Taip pat žiūrėkite :

1212
17 апр. „ Houman“ nustatė balandžio 17 d 2009-04-17 19:42 '09, 07:42 pm 2009-04-17 19:42
@ 35 atsakymai
  • 1
  • 2

Tol, kol jūsų klausimas nurodo „generinį OO“, atrodo, kad jis daugiausia dėmesio skiria šių .NET terminų naudojimui.

.NET (panašus į „Java“):

  • sąsajos gali neturėti būsenos ar įgyvendinimo
  • klasė, įgyvendinanti sąsają, turi užtikrinti visų šio sąsajos metodų įgyvendinimą
  • abstrakčios klasės gali apimti būseną (duomenų elementus) ir (arba) įgyvendinimą (metodus)
  • abstrakčios klasės gali būti paveldimos neįgyvendinant abstrakčių metodų (nors tokia išvestinė klasė yra abstrakta)
  • sąsajos gali būti paveldimos, abstrakčios klasės gali nebūti (tai tikriausiai yra pagrindinė konkreti priežastis, kodėl sąsajos egzistuoja atskirai nuo abtraktų klasių - jos leidžia daugkartinį paveldėjimą, kuris pašalina daugelį bendrų MI problemų).

Kaip bendri OO nariai, skirtumai nebūtinai yra aiškiai apibrėžti. Pvz., Yra C ++ programuotojų, kurie gali laikytis panašių griežtų apibrėžimų (sąsajos yra griežtas abstrakčių klasių pogrupis, kuriame negali būti įdiegimo), o kai kurios gali teigti, kad abstrakta klasė su kai kuriomis numatytomis realizacijomis vis dar yra sąsaja arba kad nė viena abstrakta klasė vis dar negali apibrėžti sąsajos.

Iš tiesų, yra C ++ idiomas, vadinamas ne virtualiąja sąsaja (NVI), kur viešieji metodai nėra virtualūs metodai, kurie yra privati ​​virtualiems metodams:

639
17 апр. Michael Burr atsakymas balandžio 17 d 2009-04-17 20:18 '09, 20:18, 2009-04-17 20:18

Kaip apie analogijas: kai buvau oro pajėgų pajėguose, eidavau į bandomąjį mokymą ir tapo JAV oro pajėgų (JAV oro pajėgų) pilotu. Tuo metu negalėjau skristi nieko, ir turėjau mokytis lėktuve. Kai tik aš turėsiu kvalifikaciją, buvau bandomasis (abstrakčios klasės) ir C-141 pilotas (specifinė klasė). Vienoje iš mano užduočių man buvo suteiktas papildomas muitas: apsaugos pareigūnas. Dabar aš vis dar esu C-141 pilotas ir bandomasis, bet aš taip pat buvau saugumo pareigūnas (aš taip pat įgyvendinau „ISafetyOfficer“). Pilotas neturėjo būti saugumo pareigūnas, kiti galėjo tai padaryti.

Visi JAV oro pajėgų pilotai privalo laikytis kai kurių oro pajėgų taisyklių, o visi „C-141“ pilotai (arba F-16 arba T-38) yra „JAV oro pajėgų pilotai“. Kiekvienas gali būti saugumo pareigūnas. Taigi apibendrinkime:

  • Pilotas: abstrakta klasė
  • C-141 Pilotas: speciali klasė
  • „ISafety“ darbuotojas: sąsaja

Pridėta pastaba: tai turėjo būti analogija, padedanti paaiškinti koncepciją, o ne kodavimo rekomendaciją. Žr. Įvairius komentarus, diskusija įdomi.

760
30 авг. Atsakymą pateikė Jay rugpjūčio 30 d. 2010-08-30 07:40 '10, 7:40 am 2010-08-30 07:40

Manau, kad atsakymas, kurio jie siekia, yra esminis arba OPPS filosofinis skirtumas.

Abstrakčios klasės paveldėjimas naudojamas, kai išvestinė klasė atskiria pagrindines abstrakčios klasės savybes ir elgesį. Elgesio rūšis, kuri faktiškai apibrėžia klasę.

Kita vertus, sąsajos paveldėjimas naudojamas tada, kai klasės dalijasi periferiniu elgesiu, kuris nebūtinai apibrėžia išvestinę klasę.

Pavyzdžiui, automobilis ir sunkvežimis dalijasi daugeliu pagrindinių automobilio abstrakčių klasių savybių ir elgesio, tačiau jie taip pat turi tam tikrą periferinį elgesį, pvz., Išmetamųjų teršalų susidarymą, kuris net ir ne automobiliams, pvz. Automobilis, sunkvežimis, gręžtuvas ir „PowerGenerator“ gali naudoti tą pačią „IExhaust“ sąsają.

194
31 авг. atsakymas pateikiamas Prasun 31 rug . 2011-08-31 15:09 '11, 15:09, 2011-08-31 15:09

Trumpas: abstrakčios klasės naudojamos panašių klasių klasės hierarchijos modeliavimui (pvz., „Animal“ gali būti abstrakta klasė ir „Human“, „Lion“, „Tiger“ gali būti konkrečios klasės)

Ir

Sąsaja naudojama ryšiui tarp dviejų panašių / skirtingų klasių, kurios nerūpi sąsajos, kuri naudoja sąsają, tipui (pavyzdžiui, aukštis gali būti sąsaja, ir gali būti įgyvendintas žmogaus, pastato, medžio. Nesvarbu, ar galite valgyti, plaukti, galite mirti ar kažką kita. visa tai yra svarbu, kad jums reikia turėti aukštį (įgyvendinimą savo klasėje).

168
05 апр. Atsakymą pateikė Dhananjay 05 Bal 2012-04-05 12:53 '12 12:53 2012-04-05 12:53

Yra keletas skirtumų -

Sąsajos negali turėti konkrečių diegimų. Abstrakčios bazinės klasės gali. Tai leidžia jums pateikti konkrečių diegimų. Tai gali leisti abstrakčiai bazinei klasei faktiškai suteikti griežtesnę sutartį, jei sąsaja tikrai apibūdina tik tai, kaip klasė naudojama. (Abstrakčioje bazinėje klasėje gali būti ne virtualių narių, apibrėžiančių elgesį, kuris suteikia daugiau kontrolės bazinės klasės autoriui.)

Klasėje gali būti įdiegtos kelios sąsajos. Klasę galima gauti tik iš vienos abstrakčios bazinės klasės. Tai leidžia naudoti polimorfinę hierarchiją naudojant sąsajas, bet ne abstrakčias bazines klases. Ji taip pat leidžia naudoti pseudo-multi-paveldėjimą naudodama sąsajas.

Abstrakčios bazinės klasės gali būti modifikuotos v2 +, nepažeidžiant API. Sąsajų pakeitimai pažeidžia pakeitimus.

[C # /. NET Specifinis] Sąsajos, skirtingai nei abstrakčios bazinės klasės, gali būti taikomos vertės tipams (structs). Struktūros negali būti paveldimos iš abstrakčių bazinių klasių. Tai leidžia taikyti elgesio sutarčių / naudojimosi taisykles vertybių tipams.

74
17 апр. atsakymą pateikė Reed Copsey balandžio 17 d 2009-04-17 19:46 '09, 19:46 PM 2009-04-17 19:46

paveldėjimas
Apsvarstykite automobilį ir autobusą. Tai yra du skirtingi automobiliai. Tačiau vis dėlto jie turi keletą bendrų savybių, tokių kaip vairo mechanizmas, stabdžiai, pavaros, variklis ir kt.
Taigi, paveldėjimo sąvoka gali būti atstovaujama taip ...

 public class Vehicle { private Driver driver; private Seat[] seatArray; //In java and most of the Object Oriented Programming(OOP) > 

Dabar dviratis ...

 public class Bicycle extends Vehicle { //You define properties which are unique to bicycles here ... private Pedal pedal; } 

Ir automobilis ...

 public class Car extends Vehicle { private Engine engine; private Door[] doors; } 

Visa tai susiję su paveldu. Mes juos naudojame klasifikuoti daiktus paprastomis pagrindinėmis formomis ir jų vaikus, kaip matėme aukščiau.

Anotacijos klasės

Anotacijos klasės yra neišsamūs objektai. Norėdami tai suprasti, dar kartą apsvarstykite analogiją su transporto priemone.
Automobilis gali būti varomas. Gerai? Tačiau skirtingos transporto priemonės važiuoja skirtingai ... Pavyzdžiui, negalite vairuoti automobilio, kaip važinėjate dviračiu.
Taigi, kaip pristatyti transporto priemonės vairavimo funkciją? Sunkiau patikrinti, kokio automobilio jis yra, ir kontroliuoti savo funkciją; Pridėjus naują transporto priemonės tipą, turėsite pakeisti vairuotojo klasę vėl ir vėl.
Čia yra abstrakčių klasių ir metodų vaidmuo. Disko metodą galite apibūdinti kaip abstraktų, kad kiekvienas vaikas, kuris paveldėtų, turi įgyvendinti šią funkciją.
Todėl, jei pakeisite automobilio klasę ...

 //......Code of Vehicle Class abstract public void drive(); //.....Code continues 

Dviratis ir automobilis taip pat turėtų nurodyti, kaip vairuoti. Priešingu atveju kodas nebus sudaromas ir bus rodoma klaida.
Trumpai tariant, abstrakta klasė yra iš dalies neišsami, o kai kurios neišsamios funkcijos, kurias paveldi vaikai, turėtų nukreipti į save.

Sąsajos Sąsajos yra visiškai neišsamios. Jie neturi savybių. Jie tiesiog rodo, kad paveldėti vaikai gali kažką daryti ...
Tarkime, jūs turite su jumis skirtingų tipų mobiliuosius telefonus. Kiekvienas iš jų turi skirtingus skirtingų funkcijų atlikimo būdus; Pavyzdys: skambinkite asmeniui. Telefono gamintojas nurodo, kaip tai padaryti. Čia mobilieji telefonai gali rinkti numerį, t.y. Surinkite numerį. Įsivaizduokite tai kaip sąsają.

 public interface Dialable { public void dial(Number n); } 

Čia Dialable kūrėjas nustato, kaip surinkti numerį. Jums tiesiog reikia suteikti jam numerį, kurį norite skambinti.

 // Makers define how exactly dialable work inside. Dialable PHONE1 = new Dialable() { public void dial(Number n) { //Do the phone1 own way to dial a number } } Dialable PHONE2 = new Dialable() { public void dial(Number n) { //Do the phone2 own way to dial a number } } //Suppose there is a function written by someone else, which expects a Dialable ...... public static void main(String[] args) { Dialable myDialable = SomeLibrary.PHONE1; SomeOtherLibrary.doSomethingUsingADialable(myDialable); } ..... 

Taigi, naudojant sąsajas vietoj abstrakčių klasių, funkcijos, kuri naudoja Dialable, rašytojas neturi jaudintis dėl jo savybių. Pavyzdys: ar yra jutiklinis ekranas arba telefono rinkinys, tai fiksuotojo telefono ryšio telefonas arba mobilusis telefonas. Jums tereikia žinoti, ar ji yra prieinama; ji paveldi (arba įgyvendina) Dialable sąsają.

Ir dar svarbiau, jei kada nors perjungsite rinkimo numerį su kitu

 ...... public static void main(String[] args) { Dialable myDialable = SomeLibrary.PHONE2; // <-- changed from PHONE1 to PHONE2 SomeOtherLibrary.doSomethingUsingADialable(myDialable); } ..... 

Galite būti tikri, kad kodas vis dar veikia gerai, nes funkcija, kuri naudoja jungiklį, nėra (ir negali) priklausyti nuo kitų dalių, nei nurodyta Dialable sąsajoje. Jie abu įgyvendina „Dialable“ sąsają, ir tai yra vienintelis dalykas, kuris rūpinasi funkcija.

Kūrėjai dažniausiai naudoja sąsajas, kad užtikrintų sąveiką (keistis) tarp objektų, nes jie turi bendrą funkciją (taip pat, kaip galite pereiti prie fiksuotojo arba mobiliojo telefono, kiek jums reikia surinkti numerį). Trumpai tariant, sąsajos yra daug paprastesnė abstrakčių klasių versija be jokių savybių.
Taip pat atkreipkite dėmesį, kad galite įgyvendinti (paveldėti) tiek daug sąsajų, kiek norite, tačiau galite tik išplėsti (paveldėti) vieną iš tėvų klasių.

Sužinokite daugiau Anotacijos klasės ir sąsajos

63
14 июня '13 в 16:11 2013-06-14 16:11 atsakymas pateikiamas fz_salam birželio 14 d. 13 val. 16:11 2013-06-14 16:11

Jei peržiūrite java kaip OOP kalbą atsakant į šį klausimą, „Java 8“ išleidimas leidžia kai kuriuos iš pirmiau minėtų atsakymų pasenus. Dabar „Java“ sąsaja gali turėti numatytuosius metodus su konkrečiu įgyvendinimu.

Oracle“ svetainė suteikia pagrindinius skirtumus tarp interface ir abstract klasės.

Apsvarstykite galimybę naudoti abstrakčias klases, jei:

  1. Norite bendrinti kodą tarp kelių glaudžiai susijusių klasių.
  2. Tikitės, kad klasėms, kurios išplės jūsų abstrakčią klasę, yra daug bendrų metodų ar laukų arba reikalaujama prieigos modifikatorių, išskyrus viešuosius (pvz., Saugomus ir privačius).
  3. Norite deklaruoti nestatinius arba ne galutinius laukus.

Apsvarstykite galimybę naudoti sąsajas, jei:

  1. Tikimasi, kad nesusijusios klasės įgyvendins savo sąsają. Pavyzdžiui, daugelis nesusijusių objektų gali įdiegti Serializable sąsają.
  2. Norite nurodyti konkretaus tipo duomenų elgesį, tačiau nesusiję su tuo, kas vykdo savo elgesį.
  3. Jūs norite naudoti keleto tipų paveldėjimą.

Paprasčiau tariant, norėčiau naudoti

sąsaja: įgyvendinti sutartį su keliais nesusijusiais objektais

abstrakta klasė: įgyvendinti tą patį arba skirtingą elgesį tarp kelių susijusių objektų

Pažvelkite į mėginio kodą, kad suprastumėte dalykus: kaip turėčiau paaiškinti skirtumą tarp sąsajos ir abstrakčios klasės?

34
27 нояб. atsakymas pateiktas Ravindra babu 27 lapkričio. 2015-11-27 22:20 '15, 10:20 val. 2015-11-27 22:20

Interviatoriai žievė keistą medį. Kalboms, tokioms kaip C # ir Java, yra skirtumas, tačiau kitomis kalbomis, pvz., C ++, ne. OO teorija nesiskiria nuo šių dviejų, o tik kalbos sintaksės.

Abstrakta klasė yra klasė su įgyvendinimu ir sąsaja (grynais virtualiais metodais), kuri bus paveldima. Sąsajos paprastai neturi įgyvendinimo, bet tik grynos virtualios funkcijos.

„C #“ arba „Java“ atveju abstrakta klasė be jokio įgyvendinimo skiriasi nuo sąsajos tik sintaksėje, kuria ją paveldėjo, ir tuo, kad jūs galite paveldėti tik vieną.

30
17 апр. Atsakė Steve Rowe balandžio 17 d 2009-04-17 19:48 '09, 19:48 PM 2009-04-17 19:48

Naudodamiesi sąsajomis, vietoj paveldėjimo gausite kompoziciją („has-a“). Tai yra svarbus principas, kurį reikia atsiminti, kai kalbama apie tokius dalykus, kaip dizaino modeliai, kuriuose reikia naudoti sąsajas, kad pasiektumėte kompozicinį elgesį, o ne paveldėjimą.

29
17 апр. Atsakymą pateikė TheTXI balandžio 17 d 2009-04-17 19:52 '09 19:52 val. 2009-04-17 19:52

Kalbėsiu apie sąsajos ir abstrakčios klasės gylį. Jei žinote sąsajos ir abstrakčios klasės apžvalgą, pirmas klausimas ateina į galvą, kai turėtume naudoti sąsają ir kada turėtume naudoti abstrakčią klasę. Todėl toliau žr. Sąsajos ir abstrakčios klasės aprašymą.

  • Kada turėtume naudoti sąsają?

    jei nežinote apie įgyvendinimą, turime specifikacijos specifikacijas, tada einame su sąsaja

  • Kada turėtume naudoti abstrakčią klasę?

    jei žinote įgyvendinimą, bet ne visiškai (iš dalies įgyvendinti), tada pereisime prie Abstrakčios klasės.

    Sąsaja

    kiekvienas metodas viešas abstraktas reiškia, kad sąsaja yra abstrakta abstrakta 100%.

    Anotacija

    gali turėti konkretų metodą ir abstraktų metodą, pvz., Betono metodą, kuris įgyvendinamas abstrakčioje klasėje, Abstrakčių klasė yra klasė, deklaruota kaip abstraktus - gali apimti abstrakčius metodus.

    Sąsaja

    Mes negalime deklaruoti sąsajos kaip uždarytos, saugomos

    Q. Kodėl mes nedeklaruojame sąsajos privačios ir saugomos?

    Kadangi numatytasis sąsajos metodas yra viešas komentaras, todėl ir nesuteikiame sąsajos privačios ir saugomos.

    Sąsajos metodas
    taip pat negalime deklaruoti sąsajos kaip uždarytos, saugomos, galutinės, statinės, sinchronizuotos, gimtosios .....

    Suteiksiu priežasties: kodėl mes nedeklaruojame sinchronizuoto metodo, nes negalime sukurti sąsajos objekto ir sinchronizuoti darbą su tokiu objektu, o sūnus teigia, kad nenurodome sinchronizuoto metodo.

    Anotacija

    mes mielai naudojame viešą, uždarytą galutinį statinį ... reiškia, kad apribojimas netaikomas abstrakčiai.

    Sąsaja

    Kintamieji yra numatyti sąsajoje kaip vieši statiniai galutiniai, todėl mes taip pat nedeklaruojame kintamojo kaip konfidencialaus, saugomo.

    Kintamasis modifikatorius taip pat netaikomas sąsajoje, nes numatytasis sąsajos kintamasis yra bendras statinis galutinis ir galutinis kintamasis, negalėsite keisti reikšmės po to, kai priskyrėte vertę kintamajam, ir kai jūs paskelbiate kintamąjį sąsajai, turite priskirti kintamąjį.

    O kintamasis kintamasis išsaugo pakeitimus, todėl opp. iki galo, todėl mes nenaudojame lakiųjų kintamųjų sąsajoje.

    Anotacija

    Abstraktus kintamasis neturi paskelbti viešojo statinio galutinio.

Tikiuosi, kad šis straipsnis bus naudingas.

23
31 мая '14 в 9:33 2014-05-31 09:33 atsakymą pateikė JegsVala gegužės 31 d. 14 val. 9:33 2014-05-31 09:33

.Net,

Jūsų atsakymas į antrąjį apklausos dalyvį taip pat yra atsakymas į pirmąjį ... Santraukos klasėse gali būti realizuotas, o valstybės, sąsajos negali ...

EDIT: Kitoje pastaboje net nenoriu naudoti frazės "poklasis" (arba "paveldėjimas"), kad apibūdintumėte klases, kurios yra "apibrėžtos įgyvendinti" sąsają. Mano nuomone, sąsaja yra sutarties apibrėžtis, kuri turi atitikti tam tikrą klasę, jei ji buvo nustatyta įgyvendinti šią sąsają. Jis nieko paveldi ... Akivaizdu, kad turite viską pridėti.

21
17 апр. Charles Bretana atsakymas, pateiktas balandžio 17 d 2009-04-17 19:48 '09, 19:48 PM 2009-04-17 19:48