Pontosan mi a különbség az interfész és az absztrakt osztály között?
Az interfész egy szerződés: Az interfészt író személy azt mondja: "Hé, elfogadom, hogy a dolgok így nézzenek ki", és az interfészt használó személy azt mondja: "OK, az általam írt osztály így néz ki".
Az interfész egy üres burok. Csak a metódusok szignatúrái vannak benne, ami azt jelenti, hogy a metódusoknak nincs testük. Az interfész nem tud semmit sem csinálni. Ez csak egy minta.
Például (álkód):
// 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;
}
}
Egy interfész megvalósítása nagyon kevés CPU-t fogyaszt, mert ez'nem egy osztály, csak egy csomó név, és ezért nincs drága keresés. Ez nagyszerű, ha számít, például beágyazott eszközökben.
Az absztrakt osztályok, ellentétben az interfészekkel, osztályok. Használatuk drágább, mivel a belőlük való örökléskor keresést kell végezni.
Az absztrakt osztályok nagyon hasonlítanak az interfészekre, de van bennük valami több: Meghatározható számukra egy viselkedés. Ez'inkább arról szól, hogy valaki azt mondja, "ezeknek az osztályoknak így kell kinézniük, és ez a közös bennük, tehát töltsd ki az üres részeket!".
Például:
// 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");
}
}
Bár az absztrakt osztályok és az interfészek elvileg különböző fogalmak, az implementációk miatt ez az állítás néha nem igaz. Néha még csak nem is azok, aminek gondolod őket.
A Java-ban ez a szabály erősen érvényesül, míg a PHP-ban az interfészek olyan absztrakt osztályok, amelyekben nincs deklarált metódus.
A Pythonban az absztrakt osztályok inkább egy programozási trükk, amit az ABC modulból szerezhetsz meg, és valójában metaklasszikusokat, tehát osztályokat használ. Az interfészek pedig ebben a nyelvben inkább a kacsa tipizáláshoz kapcsolódnak, és ez'a konvenciók és a leírókat hívó speciális metódusok (a __method___metódusok) keveréke.
Mint általában a programozásnál, itt is van elmélet, gyakorlat, és gyakorlat egy másik nyelven :-)
A magyarázat itt található: http://www.developer.com/lang/php/article.php/3604111/PHP-5-OOP-Interfaces-Abstract-Classes-and-the-Adapter-Pattern.htm
Az absztrakt osztály egy olyan osztály, ami csak részben valósítja meg a programozó. Tartalmazhat egy vagy több absztrakt metódust. Egy absztrakt metódus egyszerűen egy függvénydefiníció, amely arra szolgál, hogy a programozónak megmondja, hogy a metódusnak egy gyermek metódusban kell implementálódnia. osztályban.
Egy interfész hasonló egy absztrakt osztályhoz. osztályhoz; az interfészek valóban elfoglalják a ugyanazt a névteret, mint az osztályok és az absztrakt interfészek. osztályok. Emiatt nem lehet nem definiálhat ugyanolyan nevű interfészt. mint egy osztály. Az interfész egy teljesen absztrakt osztály; egyik metódusa sem nincs implementálva, és egy osztály helyett alosztályozás helyett azt mondják, hogy az interfész implementálja az adott interfészt.
Mindenesetre az interfészek magyarázatát kissé zavarosnak találom. Egy elterjedtebb definíció a következő: Egy interfész olyan szerződést határoz meg, amelyet az implementáló osztályoknak teljesíteniük kell. Egy interfész definíció a nyilvános tagok aláírásaiból áll, implementáló kód nélkül.
Nem igazán ez a válasz az eredeti kérdésre, de ha már megvan a válasz a kettő közötti különbségre, akkor beléphetsz a mikor-használjam-az-egyet dilemmába: https://stackoverflow.com/questions/1231985/when-to-use-interfaces-or-abstract-classes-when-to-use-both
I've korlátozott ismeretekkel rendelkezem az OOP-ról, de az interfészeket a nyelvtanban a melléknévvel egyenértékűnek tekintve eddig működött számomra (javítsatok ki, ha ez a módszer kamu!). Például az interfésznevek olyanok, mint az attribútumok vagy képességek, amiket egy osztálynak adhatsz, és egy osztálynak sok ilyenje lehet: ISerializable, ICountable, IList, ICacheable, IHappy, ...