Abstrakti luokka

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 16.5.2020 tarkistetusta versiosta . tarkastukset vaativat 12 muokkausta .

Abstrakti luokka olioohjelmoinnissa on perusluokka , joka ei vaadi ilmentämistä. Abstraktit luokat toteuttavat käytännössä yhtä OOP- polymorfismin periaatteista . Abstrakti luokka voi sisältää tai ei voi sisältää [1] ) abstrakteja menetelmiä ja ominaisuuksia . Abstraktia menetelmää ei ole toteutettu luokassa, jossa se on ilmoitettu, mutta se on toteutettava sen ei-abstrakteille jälkeläisille. Abstraktit luokat ovat yleisimpiä abstraktioita , eli niillä on suurin määrä ja pienin sisältö .

Joissakin kielissä abstraktien luokkien esiintymien luominen on kiellettyä, toisissa se on sallittua (esim. Delphi), mutta tämän luokan objektin abstraktin menetelmän käyttäminen ohjelman suorittamisen aikana johtaa virheeseen. Monilla kielillä on hyväksyttävää julistaa mikä tahansa luokka abstraktiksi, vaikka siinä ei olisi abstrakteja menetelmiä (esimerkiksi Java), juuri ilmentymisen kieltämiseksi. Abstraktia luokkaa voidaan pitää rajapintana sen muodostamaan luokkaperheeseen, mutta toisin kuin klassisella rajapinnalla, abstraktilla luokalla voi olla tiettyjä menetelmiä ja ominaisuuksia.

Abstraktit menetelmät ovat aina virtuaalisia , mutta "abstrakti" ja "virtuaali" ovat eri käsitteitä.

Esimerkkejä

Delphi

Delphissä abstrakti luokka abstrakteilla menetelmillä voidaan ilmoittaa:

TAbstractClass = luokkamenettely NonAbstractProcedure ; _ menettely AbstractProcedure ; abstrakti ; loppu ;

Tällaiselle luokalle voidaan luoda objekti, mutta metodin kutsuminen AbstractProcedurekyseiselle objektille ajon aikana aiheuttaa virheen.

Delphin uusimmissa versioissa itse luokka voidaan myös julistaa abstraktiksi:

TAbstractClass = luokka abstrakti menettely SomeProcedure ; loppu ;

Vaikka menetelmä SomeProcedureei ehkä ole abstrakti ja toteutettu kyseisessä luokassa, on laitonta luoda tällä tavalla ilmoitettuja luokan objekteja.

C++

C++ : ssa abstraktin luokan ilmoitetaan sisältävän vähintään yhden puhtaan virtuaalisen funktion , tyyppiä virtual _сигнатура_функции_ =0;, joka, kuten muutkin, voidaan korvata. Esimerkki C++ ohjelmointikielellä:

#include <iostream> luokka CA { // Abstrakti luokka julkinen : CA ( void ) { std :: cout << "Tämä luokan objekti" ; } virtuaalinen void Abstr ( void ) = 0 ; // Puhdas (tyhjä) virtuaalifunktio. void fun ( void ) { std :: cout << "Toteutus ei periydy!" ; } ~ CA () { std :: cout << "." << std :: endl ; } //Kutsuttu arr. rakentajien järjestys }; luokka CB : julkinen CA { julkinen : CB ( void ) { std :: cout << "CB;" ; } void Abstr ( void ){ std :: cout << " kutsu toimintoa cb.Abstr();" ; } //Korvaava toiminto. void fun ( void ){ std :: cout << " kutsu toimintoa cb.fun()" ; } ~ CB () {} // Ei pidä paikkaansa abstr. luokkaa ~CB(){ ~CA(); } }; luokka CC : julkinen CA { julkinen : CC ( void ) { std :: cout << "CC;" ; } void Abstr ( void ) { std :: cout << " kutsu toimintoa cc.Abstr();" ; } //Korvaava toiminto. void fun ( void ) { std :: cout << " kutsu toimintoa cc.fun()" ; } ~ CC () {} // Ei pidä paikkaansa abstr. luokkaa ~CC(){ ~CA(); } }; int main () { std :: cout << "Ohjelma:" << std :: endl ; CB cb ; cb . abstr (); cb . hauskaa (); cb . ~ CB (); CC cc ; cc . abstr (); cc . hauskaa (); cc . ~ cc (); paluu 0 ; }

Ohjelman tulos:

Ohjelmoida: Tämä luokan CB objekti; kutsu funktiota cb.abstr(); kutsu funktiota cb.fun(). Tämä luokan CC objekti; kutsu funktiota cc.abstr(); kutsu funktiota cc.fun(). . .

C#

Abstrakti muokkaaja osoittaa, että luokkaa voidaan käyttää vain perinnön perusluokkana. Abstraktit luokat voivat sisältää abstrakteja menetelmiä ja aksessoreita. Abstraktin luokan ilmentymää ei voida luoda kutsumalla konstruktoria, mutta abstraktin luokan ilmentymä luodaan implisiittisesti, kun muodostetaan johdetun konkreettisen luokan ilmentymä. Abstraktista luokasta peräisin olevan ei-abstraktin luokan on sisällettävä kaikkien perittyjen abstraktien menetelmien ja aksessorien todelliset toteutukset. Osoittaaksesi, että menetelmässä tai ominaisuudessa ei ole toteutusta, käytä abstraktia muokkausta menetelmässä tai ominaisuudessa. Abstrakti menetelmä on implisiittinen virtuaalinen menetelmä. Abstraktien jäsenten (menetelmät, ominaisuudet, tapahtumat) ilmoitukset ovat sallittuja vain abstrakteissa luokissa ja rajapinnoissa (stereotyypit, jotka ovat analogisia puhtaiden abstraktien luokkien kanssa, joissa mikä tahansa toteutus on kielletty). Koska abstrakti menetelmän ilmoitus ei tarjoa varsinaista toteutusta, menetelmän runkoa ei ole, menetelmän ilmoitus yksinkertaisesti päättyy puolipisteeseen, kuten prototyyppiilmoitukset:

julkinen abstrakti void AbstractMethod ();

Toteutuksen tarjoaa ohitusmenetelmä, joka on ei-abstraktin luokan jäsen.

Staattisten tai virtuaalisten muokkaajien käyttö abstraktissa menetelmässä tai ominaisuusilmoituksessa on laitonta. Abstraktit ominaisuudet toimivat samalla tavalla kuin abstraktit menetelmät, lukuun ottamatta eroja määrittelyssä ja kutsusyntaksissa. Abstrakti peritty ominaisuus voidaan ohittaa johdetussa luokassa sisällyttämällä ominaisuusilmoitus, joka käyttää ohitusmuuttujaa.

abstrakti luokka BaseClass // Abstrakti luokka { suojattu int _x = 100 ; suojattu int _y = 150 ; julkinen abstrakti void AbstractMethod (); // Abstrakti menetelmä public abstract int X { get ; } julkinen abstrakti int Y { get ; } } class DerivedClass : BaseClass { public override void AbstractMethod () { _x ++; _y ++; } public override int X // ohitusominaisuus { get { return _x + 10 ; } } julkinen ohitus int Y // ohitusominaisuus { get { return _y + 10 ; } } static void Main () { DerivedClass o = new DerivedClass (); o . AbstractMethod (); konsoli . WriteLine ( "x = {0}, y = {1}" , o . X , o . Y ); } } // Tulos: x = 111, y = 161

Abstraktin luokan on tarjottava toteutus kaikille käyttöliittymän jäsenille. Abstrakti luokka, joka toteuttaa rajapinnan, voi yhdistää käyttöliittymämenetelmät abstrakteihin menetelmiin.

käyttöliittymä I { void M (); } abstrakti luokka C : I { public abstract void M (); }

Abstraktia luokkaa, jossa on sinetöity muuntaja, ei voida käyttää, koska abstraktilla ja suljetulla modifikaatiolla on toisensa poissulkevia merkityksiä. Sinetöity muuntaja estää luokan periytymisen, kun taas abstrakti muokkaaja määrittää, että luokalla on oltava johdettuja luokkia.

Muistiinpanot

  1. Abstraktit menetelmät ja luokat (Java™-opetusohjelmat > Java-kielen oppiminen > Liitännät ja periytyminen) . Käyttöpäivä: 30. syyskuuta 2010. Arkistoitu alkuperäisestä 2. elokuuta 2010.

Katso myös

Kirjallisuus

  • Podbelsky VV Luku 10.3 Virtuaalifunktiot ja abstraktit luokat \\ Abstraktit luokat. // C++-kieli / rec. Dadaev Yu. G. - 4. - M . : Talous ja tilastot , 2003. - S. 365-373. - 560 s. - ISBN 5-279-02204-7 , UDC 004.438Si (075.8) LBC 32.973.26-018 1ya173.