Mis vahe on täpselt liidesel ja abstraktsel klassil?
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, 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");
}
}
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 :-)
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.
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, ...