de-vraag
  • Küsimused
  • Sildid
  • Kasutajad
Teated
Preemiad
Registreerimine
Kui olete registreerunud, teavitatakse teid vastustest ja kommentaaridest teie küsimustele.
Logi sisse
Kui teil on juba konto, logige sisse, et kontrollida uusi teateid.
Lisatavate küsimuste, vastuste ja kommentaaride eest antakse auhindu.
Rohkem
Allikas
Muuda
 Sarfraz
Sarfraz
Küsimus

Mis vahe on liidese ja abstraktse klassi vahel?

Mis vahe on täpselt liidesel ja abstraktsel klassil?

1699 2009-12-16T08:15:15+00:00 3
 brice
brice
Redigeeritud küsimus T33 veebruar 2017 в 5:36
Programmeerimine
oop
interface
abstract-class
Populaarsed videod
Section 3
Section 3
7 aastat tagasi
From C to Python by Ross Rheingans-Yoo
From C to Python by Ross Rheingans-Yoo
5 aastat tagasi
Oliver Berkes - Világítótorony
Oliver Berkes - Világítótorony
3 aastat tagasi
How to Manage Virtual Teams - Q&A E5 #AskTheCEO
How to Manage Virtual Teams - Q&A E5 #AskTheCEO
11 kuud tagasi
Work Less & Accomplish More - Q&A E3 #AskTheCEO
Work Less & Accomplish More - Q&A E3 #AskTheCEO
11 kuud tagasi
You Bet Your Life #57-01 Lena & Mercedes, the confusing Portuguese sisters ('Food', Sep 26, 1957)
You Bet Your Life #57-01 Lena & Mercedes, the confusing Portuguese sisters ('Food', Sep 26, 1957)
8 aastat tagasi
The Groucho Marx Show: American Television Quiz Show - Wall / Water Episodes
The Groucho Marx Show: American Television Quiz Show - Wall / Water Episodes
9 aastat tagasi
Week 5
Week 5
8 aastat tagasi
You Bet Your Life: Secret Word - Water / Face / Window
You Bet Your Life: Secret Word - Water / Face / Window
9 aastat tagasi
Python Web Apps with Flask by Ezra Zigmond
Python Web Apps with Flask by Ezra Zigmond
5 aastat tagasi
CS50 2013 - Week 4, continued
CS50 2013 - Week 4, continued
8 aastat tagasi
The Great Gildersleeve: Leroy's Pet Pig / Leila's Party / New Neighbor Rumson Bullard
The Great Gildersleeve: Leroy's Pet Pig / Leila's Party / New Neighbor Rumson Bullard
9 aastat tagasi
You Bet Your Life - OUTTAKES (Complete!)
You Bet Your Life - OUTTAKES (Complete!)
6 aastat tagasi
Programming - Computer Science for Business Leaders 2016
Programming - Computer Science for Business Leaders 2016
6 aastat tagasi
Technology Stacks - Computer Science for Business Leaders 2016
Technology Stacks - Computer Science for Business Leaders 2016
6 aastat tagasi
« Eelmine
Järgmine »
See küsimus on 1 vastus inglise keeles, nende lugemiseks logi sisse oma kontole.
Lahendus / vastus
 e-satis
e-satis
T22 detsember 2009 в 8:37
2009-12-16T08:37:12+00:00
Rohkem
Allikas
Muuda
#9818596

Liidesed

Liides on leping: Inimene, kes kirjutab liidese, ütleb: "hei, ma aktsepteerin, et asjad näevad välja nii", ja inimene, kes kasutab liidese, ütleb: "OK, klass, mille ma kirjutan, näeb välja nii".

Liides on tühi kest. Seal on ainult meetodite signatuurid, mis tähendab, et meetoditel ei ole keha. Liides ei saa midagi teha. See on lihtsalt muster.

Näiteks (pseudokood):

// I say all motor vehicles should look like this:
interface MotorVehicle
{
    void run();

    int getFuel();
}

// My team mate complies and writes vehicle looking that way
class Car implements MotorVehicle
{

    int fuel;

    void run()
    {
        print("Wrroooooooom");
    }

    int getFuel()
    {
        return this.fuel;
    }
}

Liidese rakendamine kulutab väga vähe protsessorit, sest see ei ole klass, vaid lihtsalt hunnik nimesid, ja seetõttu ei ole vaja teha mingeid kalleid otsinguid. See on suurepärane, kui see on oluline, näiteks manussüsteemides.


Abstraktsed klassid

Abstraktsed klassid, erinevalt liideseist, on klassid. Nende kasutamine on kallim, sest nende pärimisel tuleb teha otsing.

Abstraktsed klassid näevad välja nagu liidesed, kuid neil on midagi enamat: Nende jaoks saab defineerida käitumist. See on rohkem sellest, et inimene ütleb: "täna klassid peaksid välja nägema nii ja naa, neil on see ühine, seega täida tühjad kohad!".

Näiteks:

// I say all motor vehicles should look like this:
abstract class MotorVehicle
{

    int fuel;

    // They ALL have fuel, so lets implement this for everybody.
    int getFuel()
    {
         return this.fuel;
    }

    // That can be very different, force them to provide their
    // own implementation.
    abstract void run();
}

// My teammate complies and writes vehicle looking that way
class Car extends MotorVehicle
{
    void run()
    {
        print("Wrroooooooom");
    }
}

Rakendamine

Kuigi abstraktsed klassid ja liidesed peaksid olema erinevad mõisted, teevad rakendused selle väite mõnikord ebatõeseks. Mõnikord ei ole nad isegi mitte see, mida te arvate, et nad on.

Java's on see reegel rangelt rakendatud, PHP's aga on liidesed abstraktsed klassid, mille puhul ei ole meetodit deklareeritud.

Pythonis on abstraktsed klassid pigem programmeerimistrikk, mida saab ABC-moodulist ja tegelikult kasutatakse metaklasse ja seega klassid. Ja liidesed on selles keeles rohkem seotud pardatüüpimisega ja see on segu konventsioonidest ja spetsiaalsetest meetoditest, mis kutsuvad deskriptoreid (__meetodid___ meetodid).

Nagu programmeerimisel ikka, on teooria, praktika ja praktika teises keeles :-)

Anjana Silva
Anjana Silva
Redigeeritud vastus T00 november 2019 в 4:45
2192
0
 Konamiman
Konamiman
T22 detsember 2009 в 8:18
2009-12-16T08:18:26+00:00
Rohkem
Allikas
Muuda
#9818583

Selgitus on leitav siit: http://www.developer.com/lang/php/article.php/3604111/PHP-5-OOP-Interfaces-Abstract-Classes-and-the-Adapter-Pattern.htm

Abstraktne klass on klass, mis on ainult osaliselt rakendatud programmeerija. See võib sisaldada ühte või mitut abstraktset meetodit. Abstraktne meetod on lihtsalt funktsiooni definitsioon, mis on selleks, et öelda programmeerijale, et meetod peab olema rakendatud lapsmeetodis klassis.

Liides on sarnane abstraktsele klass; tegelikult hõivavad liidesed sama nimeruumi kui klassid ja abstraktsed klassid. Sel põhjusel ei saa defineerida sama nimega liidest. kui klass. Liides on täielikult abstraktne klass; ükski selle meetoditest ei ole on rakendatud ja klassi asemel alamklassi asemel öeldakse, et see on > alamklass. rakendab seda liidest.

Igatahes tundub mulle see liidesete seletus mõnevõrra segadusttekitav. Levinum määratlus on: Liides määratleb lepingu, mida rakendavad klassid peavad täitma. Liidese definitsioon koosneb avalike liikmete allkirjadest, ilma rakenduskoodita.

 Konamiman
Konamiman
Redigeeritud vastus T22 detsember 2009 в 8:24
80
0
 azkotoki
azkotoki
T22 detsember 2009 в 8:48
2009-12-16T08:48:00+00:00
Rohkem
Allikas
Muuda
#9818701

See ei ole tegelikult vastus algsele küsimusele, kuid kui te olete saanud vastuse nende erinevusele, jõuate te dilemma "millal-kasutada-kumbagi" juurde: https://stackoverflow.com/questions/1231985/when-to-use-interfaces-or-abstract-classes-when-to-use-both

Mul on piiratud teadmised OOP-st, kuid liideste nägemine grammatika adjektiivi ekvivalendina on mulle seni toiminud (parandage mind, kui see meetod on võlts!). Näiteks on liideste nimed nagu atribuudid või võimed, mida saab klassile anda, ja klassil võib neid olla palju: ISerializable, ICountable, IList, ICacheable, IHappy, ...

 Community
Community
Redigeeritud vastus T11 mai 2017 в 12:02
4
0
Lisa küsimus
Kategooriad
Kõik
Tehnoloogia
Kultuur / Vaba aeg
Elu / Kunst
Teadus
Professionaalne
Äri
Kasutajad
Kõik
Uus
Populaarne
1
mohidil qodirova
Registreeritud 6 tundi tagasi
2
Jasur Fozilov
Registreeritud 19 tundi tagasi
3
Zuxriddin Muydinov
Registreeritud 1 päev tagasi
4
Денис Анненский
Registreeritud 3 päeva tagasi
5
365
Registreeritud 1 nädal tagasi
BG
DA
DE
EL
ES
ET
FI
FR
HU
ID
IT
JA
KO
LV
NL
PT
RO
RU
SK
ZH
© de-vraag 2022
Allikas
stackoverflow.com
litsentsi alusel cc by-sa 3.0 atribuudiga