Kāda ir atšķirība starp saskarni un abstrakto klasi?

Kāda ir atšķirība starp saskarni un abstrakto klasi?

Risinājums

Saskarnes

Saskarne ir līgums: Persona, kas raksta interfeisu, saka: "hei, es pieņemu, ka lietas izskatās šādi", un persona, kas izmanto interfeisu, saka: "OK, klase, ko es rakstu, izskatās šādi".

Interfeiss ir tukšs apvalks. Tajā ir tikai metožu paraksti, kas nozīmē, ka metodēm nav ķermeņa. Interfeiss neko nevar'darīt. Tas ir tikai modelis.

Piemēram (pseidokods):

// 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;
    }
}

Interfeisa ieviešana patērē ļoti maz procesora jaudas, jo tā nav klase, tikai vārdu kopums, un tāpēc nav jāveic dārga meklēšana. Tas ir lieliski, kad tas ir svarīgi, piemēram, iegultajās ierīcēs.


Abstraktās klases

Abstraktās klases atšķirībā no saskarnēm ir klases. To lietošana ir dārgāka, jo, pārņemot no tām, ir jāveic meklēšana.

Abstraktās klases izskatās ļoti līdzīgi saskarnēm, taču tām ir kas vairāk: Tām var definēt uzvedību. Tas vairāk nozīmē, ka cilvēks saka: "Šīm klasēm vajadzētu izskatīties šādi, un tām ir tas, kas tām kopīgs, tāpēc aizpildiet tukšos laukumus!".

Piemēram:

// 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");
    }
}

Īstenošana

Lai gan abstraktajām klasēm un saskarnēm vajadzētu būt atšķirīgiem jēdzieniem, implementācijas padara šo apgalvojumu dažkārt nepatiesu. Dažreiz tās pat nav tādas, kādas jūs domājat, ka tās ir.

Programmā Java šis noteikums tiek stingri ievērots, savukārt PHP interfeisi ir abstraktas klases bez deklarētām metodēm.

Python valodā abstraktās klases drīzāk ir programmēšanas triks, ko var iegūt no ABC moduļa, un patiesībā tiek izmantotas metaklases, tātad klases. Savukārt interfeisi šajā valodā ir vairāk saistīti ar pīļu tipizēšanu, un tas'ir konvenciju un īpašu metožu, kas izsauc deskriptorus (__metodes_ metodes), sajaukums.

Kā parasti programmēšanā ir teorija, prakse un prakse citā valodā :-)

Komentāri (22)

Paskaidrojumu var atrast šeit:

Abstraktā klase ir klase, kas ir tikai daļēji īstenota programmētājs. Tā var saturēt vienu vai vairākas abstraktās metodes. Abstraktā metode ir vienkārši funkcijas definīcija, kas kalpo, lai programmētājam norādītu, ka metode jāimplementē atvasinātajā funkcijā klasei.

Interfeiss ir līdzīgs abstraktai valodai. klasei; patiešām saskarnes aizņem to pašu vārdu telpu, ko klases un abstraktās saskarnes klases. Šī iemesla dēļ jūs nevarat definēt saskarni ar tādu pašu nosaukumu kā klasi. Interfeiss ir pilnībā abstraktā klase; neviena no tās metodēm nav abstrakta. tiek īstenotas, un klases vietā apakšklases no tās, tiek teikts, ka tā ir implementē šo saskarni.

Katrā ziņā man šis interfeisu skaidrojums šķiet nedaudz mulsinošs. Biežāk lietotā definīcija ir šāda: Interfeiss definē līgumu, kas jāpilda implementējošajām klasēm. Interfeisa definīcija sastāv no publisko locekļu parakstiem, bez ieviešanas koda..

Komentāri (3)

Tā īsti nav atbilde uz sākotnējo jautājumu, bet, kad būsiet uzzinājuši, kāda ir atšķirība starp tām, jūs varēsiet atrisināt dilemmu, kad izmantot katru no tiem: https://stackoverflow.com/questions/1231985/when-to-use-interfaces-or-abstract-classes-when-to-use-both

Man'ir ierobežotas zināšanas par OOP, bet saskarņu kā īpašības vārda ekvivalenta aplūkošana gramatikā man līdz šim ir darbojusies (labojiet mani, ja šī metode ir fiktīva!). Piemēram, saskarņu nosaukumi ir kā atribūti vai iespējas, ko var piešķirt klasei, un klasei var būt daudz šādu atribūtu: ISerializable, ICountable, IList, ICacheable, IHappy, ...

Komentāri (0)