Če na kodiranju vprašate, "kakšna je glavna razlika med vmesnikom in abstraktnim razredom", kakšen je pravilen odgovor?


Odgovor 1:

Človek živ, polovico sem jih rodila do smrti.

Resnično ne vem odgovora, vem pa, kakšno je moje mnenje.

Vmesnike uporabljam kot obljubo klicanja kode, kaj lahko pričakuje. To je abstrakcija - stvar, ki je vedno resnična, ne glede na to, kako jo izvajate. Zame predstavlja (običajno) domeno aplikacije - predmet.

Moj zadnji primer je

vmesnik UserProfiles {
  Neobvezna obremenitev  (UUID accountNumber);
}

Klicna koda poda ID računa in dobi profil nazaj, če je na voljo.

Trenutno prehajamo v sistem nekaj izvedb. Tu je morda v pomoč abstraktni razred.

Abstraktni razred mi predstavlja 'prilagodljiv mehanizem'. To ni del vsebine. Stranka se nanjo ne sme zanašati kot na obljubo o opravljenih storitvah.

Je del izvajanja. Zlasti gre za skupno kodo za izvajanje, ki se deli med dvema ali več možnimi izvedbami vmesnika.

Morda bi imeli abstraktni razred

abstraktni razred DatabaseUserProfiles izvaja UserProfiles {
  Izbirno  load (UUID accountNumber) {
    String databaseSpecificSql = getQueryFindByAccountNumber (accountNumber);

    vrniti ExecuteQuery (databaseSpecificSql);
  }

  abstraktni niz getQueryFindByAccountNumber (UUID accountNumber);
}

V tem izmišljenem primeru bi imeli nekaj izdelkov baz podatkov SQL, ki smo jih podprli za shranjevanje profilov, in za vrnitev baze podatkov, specifičnih za SQL, uporabimo GoF 'šablonsko metodo' getQueryFindByAccountNumber ().

Deli skupne uporabe splošne baze podatkov SQL bi bili drugje v tem abstraktnem razredu.

Torej, ja, dejansko bi imel vmesnik - zadeva / obljuba odjemalca - in ABC (včasih) - deljeno izvajanje.

Dva različna namena berljivosti.

In ja, ker je Java 8/9/10 karkoli, je ta vrstica tako zamegljena, kot je bila kdajkoli prej v C ++. Čeprav lahko ABC uporabite za oboje namene, ne želim, saj bralca mojega ne prenese kodirajte, kar želim, da pove.

Na tej točki smo vsi videti nekoliko dolgočasni in preidemo na malo deske, pričakujem.


Odgovor 2:

Mislim, da bi rekel, da vmesnik podpira večkratno dedovanje, abstraktni razred pa ne. Druga razlika je v tem, da morajo biti vse metode v vmesniku abstraktne.

Vmesnik je pravzaprav bolj abstrakten kot sam abstraktni razred. Če bi morali, lahko ustvarite celo vmesnik, ki razširi več drugih vmesnikov.

Vmesnik je končni abstraktni razred. Abstraktni razred je hibrid med vmesnikom in razredom betona.

Abstraktni razred lahko vsebuje konkretne metode in tako lahko večkratno dedovanje ustvari dvoumno preglasitev konkretnih metod, kar pa ne velja za preglasitve abstraktnih metod, ker so abstraktne metode prazne, če je to smiselno, in tako Java omogoča le večkratno dedovanje za vmesnike.

Če pogledate hierarhijo zbirk Java, boste videli, kako vmesniki naredijo graf acikličen kot drevo Git in ne kot binarno, kot bi bilo, če vmesniki ne bi bili uporabljeni.


Odgovor 3:

Mislim, da bi rekel, da vmesnik podpira večkratno dedovanje, abstraktni razred pa ne. Druga razlika je v tem, da morajo biti vse metode v vmesniku abstraktne.

Vmesnik je pravzaprav bolj abstrakten kot sam abstraktni razred. Če bi morali, lahko ustvarite celo vmesnik, ki razširi več drugih vmesnikov.

Vmesnik je končni abstraktni razred. Abstraktni razred je hibrid med vmesnikom in razredom betona.

Abstraktni razred lahko vsebuje konkretne metode in tako lahko večkratno dedovanje ustvari dvoumno preglasitev konkretnih metod, kar pa ne velja za preglasitve abstraktnih metod, ker so abstraktne metode prazne, če je to smiselno, in tako Java omogoča le večkratno dedovanje za vmesnike.

Če pogledate hierarhijo zbirk Java, boste videli, kako vmesniki naredijo graf acikličen kot drevo Git in ne kot binarno, kot bi bilo, če vmesniki ne bi bili uporabljeni.


Odgovor 4:

Mislim, da bi rekel, da vmesnik podpira večkratno dedovanje, abstraktni razred pa ne. Druga razlika je v tem, da morajo biti vse metode v vmesniku abstraktne.

Vmesnik je pravzaprav bolj abstrakten kot sam abstraktni razred. Če bi morali, lahko ustvarite celo vmesnik, ki razširi več drugih vmesnikov.

Vmesnik je končni abstraktni razred. Abstraktni razred je hibrid med vmesnikom in razredom betona.

Abstraktni razred lahko vsebuje konkretne metode in tako lahko večkratno dedovanje ustvari dvoumno preglasitev konkretnih metod, kar pa ne velja za preglasitve abstraktnih metod, ker so abstraktne metode prazne, če je to smiselno, in tako Java omogoča le večkratno dedovanje za vmesnike.

Če pogledate hierarhijo zbirk Java, boste videli, kako vmesniki naredijo graf acikličen kot drevo Git in ne kot binarno, kot bi bilo, če vmesniki ne bi bili uporabljeni.