Rustu nedostaje izvorna podrška za OOP, ali svejedno možete koristiti ove tehnike da iskoristite prednost paradigme.

Objektno orijentirano programiranje (OOP) pojednostavljuje dizajn softvera naglašavajući korištenje objekata za predstavljanje entiteta i koncepata stvarnog svijeta. OOP potiče mogućnost održavanja enkapsulacijom funkcionalnosti unutar objekata.

Rust je fleksibilan jezik koji podržava funkcionalno i proceduralno programiranje. Iako izvorno ne podržava objektno orijentirano programiranje, možete implementirati OOP koncepte koristeći Rustove ugrađene tipove podataka.

Enkapsulacija u Rustu

Enkapsulacija podrazumijeva organiziranje koda u samostalne jedinice koje skrivaju unutarnje detalje dok izlaganje javnog sučelja za vanjsku interakciju kako bi se smanjila složenost i poboljšao kod održivost.

Možete enkapsulirati Rust kod s modulima. Modul je skup stavki uključujući funkcije, strukture, enume i konstante. Rust moduli pružaju funkcionalnost za grupiranje i definiranje granica između dijelova programa.

instagram viewer

Korištenje modula za enkapsulaciju podataka i funkcija

Možete definirati modul pomoću mod ključna riječ iza koje slijedi naziv:

mod moj_modul {
// stavke modula idu ovdje
}

Module možete organizirati hijerarhijski ugniježđujući njihove deklaracije:

mod nadređeni_modul {
mod moj_modul {
// stavke modula idu ovdje
}
}

Zatim se možete pozvati na ugniježđene module s punom hijerarhijom, odvajajući svaki modul dvostrukom dvotočkom, na primjer, nadređeni_modul:: moj_modul.

Prema zadanim postavkama, stavke unutar modula su privatne i dostupne samo kodu unutar istog modula. Ali module možete učiniti javnima pomoću pub ključna riječ:

mod moj_modul {
pubfnmoja_funkcija() {
// tijelo funkcije ide ovdje
}
}

Tada možete pristupiti moja_funkcija iz drugih dijelova vašeg programa.

Korištenje osobina za definiranje ponašanja

Još jedan način na koji Rust omogućuje enkapsulaciju je korištenje svojstava. Svojstva definiraju ponašanja koja tipovi mogu implementirati i osiguravaju usklađenost različitih tipova s ​​istim sučeljem.

pubosobinaZa ispis {
fnispisati(&sebe);
}

pubstrukturiratiMyType {
// struktuirajte polja ovdje
}

impl Za ispis za MyType {
fnispisati(&sebe) {
// implementacija ovdje
}
}

The Za ispis osobina ima a ispisati metoda, i MyType struct implementira Za ispis osobina implementacijom ispisati metoda.

Koristeći značajke, možete osigurati da svaka vrsta koja implementira Za ispis osobina ima a ispisati metoda. Ovo je zgodno kada radite s generičkim kodom koji treba interoperirati s različitim tipovima koji dijele zajedničko ponašanje.

Nasljedstvo u Rustu

Nasljeđivanje vam omogućuje definiranje jedne klase na temelju druge. Podklasa će naslijediti svojstva i metode svog roditelja.

U Rustu vas se potiče da koristite kompoziciju umjesto nasljeđivanja. Kompozicija je proces stvaranja novih objekata kombiniranjem postojećih. Umjesto stvaranja nove klase koja nasljeđuje funkcionalnost od osnovne klase, možete stvoriti novu strukturu koja sadrži instancu osnovne strukture i njezina polja.

Stvaranje novih tipova kombiniranjem postojećih tipova

Koristit ćete enume i strukture za stvaranje novih tipova. Enumi su zgodni za tipove s konačnim vrijednostima, a strukture mogu sadržavati više polja.

Možete stvoriti enum tip za različite vrste životinja.

nabrajanjeŽivotinja {
Mačka,
Pas,
Ptica,
// ...
}

Alternativno, možete stvoriti strukturu koja sadrži polja za svaku vrstu životinje. Strukture mogu sadržavati enume i druge vrste.

strukturiratiŽivotinja {
Ime: Niz,
dob: u8,
animal_type: Vrsta životinje,
}

nabrajanjeAnimalType {
Mačka,
Pas,
Ptica,
// ...
}

The Životinja struct sadrži vrijednosti od AnimalType vrsta nabrajanja.

Svojstva možete koristiti za implementaciju nasljeđivanja i dodavanje ponašanja tipu bez stvaranja novog.

osobinaLetjeti {
fnletjeti(&sebe);
}

Evo kako možete implementirati Letjeti osobina za više vrsta.

strukturiratiPtica {
Ime: Niz,
raspon krila: f32,
}

impl Letjeti za Ptica {
fnletjeti(&sebe) {
println!("{} leti!", sebe.Ime);
}
}

strukturiratiAvion {
model: Niz,
maksimalna brzina: u32,
}

impl Letjeti za ravnina {
fnletjeti(&sebe) {
println!("{} leti!", sebe.model);
}
}

The Ptica i Avion strukture implementiraju Letjeti osobina i ispis nizova s Println! makro.

Možete nazvati letjeti metoda na obje strukture bez poznavanja njihovih specifičnih tipova.

fnglavni() {
neka ptica = ptica {
Ime: Niz::iz("Orao"),
raspon krila: 2.0,
};

neka ravnina = ravnina {
model: Niz::iz("Boeing 747"),
maksimalna brzina: 900,
};

neka leteći_objekti: Vecdin Letjeti> = vec![&ptica, &avion];

za objekt u leteći_objekti {
object.fly();
}
}

The glavni funkcija instancira Avion i Ptica vrste. The leteći_objekti vektor je vektor instanci objekta, a za petlja prolazi kroz vektor i poziva letjeti metoda na primjerima.

Implementacija polimorfizma u Rustu

Klasa ili tip je polimorfni ako više tipova predstavlja sučelje. Budući da značajke pružaju funkcionalnost za definiranje ponašanja u Rustu, dok istovremeno pružaju zajedničko sučelje za pisanje generičkog koda, možete koristiti značajke za implementaciju polimorfizma.

Evo osobine pod nazivom Mogućnost crtanja koji definira ponašanje za renderiranje objekata na ekranu:

osobinaMogućnost crtanja {
fncrtati(&sebe);
}

Tipovi koji implementiraju značajku Drawable mogu pristupiti crtati funkcija.

strukturiratiPravokutnik {
širina: u32,
visina: u32,
}

impl Mogućnost crtanja za Pravokutnik {
fncrtati(&sebe) {
// Prikaz pravokutnika na ekranu
}
}

Možete napisati generički kod koji crta objekte koji implementiraju Mogućnost crtanja osobina.

fncrtani_objekt(objekt: &T) {
object.draw();
}

The crtani_objekt funkcija ima generički tip T kao ulaz koji implementira Mogućnost crtanja osobina i naziva crtati metoda na osobinu. Različiti objekti mogu implementirati Mogućnost crtanja osobina i pristup funkcionalnosti.

Implementacija apstrakcije u Rustu

Apstrakcija je OOP koncept gdje su klase i sučelja dostupni određenim objektima i tipovima. Možete implementirati apstrakciju u Rustu pomoću značajki.

Evo primjera značajke za media player:

osobinaMediji {
fnigra(&sebe);
}

Strukture i enumi koji implementiraju Mediji osobina mora osigurati implementaciju za igra metoda.

strukturiratiPjesma {
titula: Niz,
umjetnik: Niz,
}

impl Mediji za pjesma {
fnigra(&sebe) {
println!("Reprodukcija pjesme: {} od {}", sebe.titula, sebe.umjetnik);
}
}

The Pjesma struct implementira Mediji osobina pružanjem implementacije za igra metoda koja ispisuje poruku s poljima Pjesma strukture na konzolu.

fnglavni() {
// Kreirajte instancu strukture Song
neka pjesma = Pjesma {
titula: Niz::iz("Češka rapsodija"),
umjetnik: Niz::iz("Kraljica"),
};

// Poziv metode reprodukcije na instanci pjesme
pjesma.play();
}

The pjesma varijabla je instanca Pjesma struct, a varijabla može pristupiti i pozvati igra metoda.

Organiziranje Rust Codea je jednostavno

Objektno orijentirano programiranje pomaže u organizaciji koda. Zahvaljujući Rustovom sustavu modula, možete jednostavno organizirati svoj Rust kod dok implementirate OOP koncepte za svoju aplikaciju kako bi vaš kod bio organiziran, upravljiv i intuitivan.