Rust nima izvorne podpore za OOP, vendar lahko s temi tehnikami vseeno izkoristite paradigmo.

Objektno usmerjeno programiranje (OOP) poenostavlja načrtovanje programske opreme s poudarjanjem uporabe objektov za predstavitev entitet in konceptov iz resničnega sveta. OOP spodbuja vzdržljivost z inkapsulacijo funkcionalnosti znotraj predmetov.

Rust je prilagodljiv jezik, ki podpira funkcionalno in proceduralno programiranje. Čeprav izvirno ne podpira objektno usmerjenega programiranja, lahko implementirate OOP koncepte z uporabo vgrajenih podatkovnih tipov Rust.

Enkapsulacija v Rust

Enkapsulacija vključuje organiziranje kode v samostojne enote, ki skrivajo notranje podrobnosti, medtem ko izpostavljanje javnega vmesnika za zunanjo interakcijo za zmanjšanje kompleksnosti in izboljšanje kode vzdržljivost.

Kodo Rust lahko enkapsulirate z moduli. Modul je zbirka elementov, vključno s funkcijami, strukturami, enumami in konstantami. Moduli Rust zagotavljajo funkcionalnost za združevanje in določanje meja med deli programa.

instagram viewer

Uporaba modulov za enkapsulacijo podatkov in funkcij

Modul lahko definirate z uporabo mod ključna beseda, ki ji sledi ime:

mod moj_modul {
// predmeti modula gredo sem
}

Module lahko organizirate hierarhično tako, da ugnezdite njihove deklaracije:

mod nadrejeni_modul {
mod moj_modul {
// predmeti modula gredo sem
}
}

Nato se lahko sklicujete na ugnezdene module s celotno hierarhijo, pri čemer vsak modul ločite z dvojnim dvopičjem, na primer, nadrejeni_modul:: moj_modul.

Privzeto so elementi znotraj modulov zasebni in dostopni samo za kodo znotraj istega modula. Vendar pa lahko module objavite z uporabo pub ključna beseda:

mod moj_modul {
pubfnmoja_funkcija() {
// telo funkcije gre sem
}
}

Nato lahko dostopate moja_funkcija iz drugih delov vašega programa.

Uporaba lastnosti za opredelitev vedenja

Drugi način, na katerega Rust omogoča enkapsulacijo, je uporaba lastnosti. Lastnosti določajo vedenja, ki jih tipi lahko izvajajo, in zagotavljajo, da se različni tipi skladajo z istim vmesnikom.

publastnostZa tiskanje {
fntiskanje(&sebe);
}

pubstructMyType {
// strukturna polja tukaj
}

impl Za tiskanje za MyType {
fntiskanje(&sebe) {
// implementacija tukaj
}
}

The Za tiskanje lastnost ima a tiskanje metoda in MyType struct izvaja Za tiskanje lastnost z izvajanjem tiskanje metoda.

Z uporabo lastnosti lahko zagotovite, da bo katera koli vrsta, ki izvaja Za tiskanje lastnost ima a tiskanje metoda. To je priročno pri delu z generično kodo, ki mora interoperirati z različnimi vrstami, ki imajo skupno vedenje.

Dedovanje v Rustu

Dedovanje vam omogoča, da definirate en razred na podlagi drugega. Podrazred bo podedoval lastnosti in metode svojega nadrejenega.

V Rustu vas spodbujamo k uporabi kompozicije namesto dedovanja. Sestava je proces ustvarjanja novih predmetov s kombiniranjem obstoječih. Namesto ustvarjanja novega razreda, ki podeduje funkcionalnost osnovnega razreda, lahko ustvarite novo strukturo, ki vsebuje primerek osnovne strukture in njena polja.

Ustvarjanje novih vrst s kombiniranjem obstoječih vrst

Za ustvarjanje novih vrst boste uporabili enume in strukture. Enumi so priročni za tipe s končnimi vrednostmi, strukture pa lahko vsebujejo več polj.

Ustvarite lahko tip enum za različne vrste živali.

enumžival {
Mačka,
pes,
ptica,
// ...
}

Lahko pa ustvarite strukturo, ki vsebuje polja za vsako vrsto živali. Strukture lahko vsebujejo enume in druge vrste.

structžival {
ime: Vrvica,
starost: u8,
živalska_vrsta: živalska vrsta,
}

enumAnimalType {
Mačka,
pes,
ptica,
// ...
}

The žival struct vsebuje vrednosti AnimalType vrsto naštevanja.

Lastnosti lahko uporabite za implementacijo dedovanja in dodajanje vedenja tipu, ne da bi ustvarili novega.

lastnostLeti {
fnleteti(&sebe);
}

Tukaj je opisano, kako lahko implementirate Leti lastnost za več tipov.

structptica {
ime: Vrvica,
razpon kril: f32,
}

impl Leti za ptica {
fnleteti(&sebe) {
println!("{} leti!", sebe.ime);
}
}

structLetalo {
model: Vrvica,
najvišja hitrost: u32,
}

impl Leti za letalo {
fnleteti(&sebe) {
println!("{} leti!", sebe.model);
}
}

The ptica in Letalo strukture izvajajo Leti trait in tiskanje nizov z Println! makro.

Lahko pokličete leteti metodo na obeh strukturah, ne da bi poznali njune posebne vrste.

fnglavni() {
pustiti ptica = ptica {
ime: Vrvica::od("Orel"),
razpon kril: 2.0,
};

pustiti ravnina = ravnina {
model: Vrvica::od("Boeing 747"),
najvišja hitrost: 900,
};

pustiti leteči_predmeti: Vecdin Leti> = vec![&ptica, &letalo];

za predmet v leteči_predmeti {
object.fly();
}
}

The glavni funkcija instancira Letalo in ptica vrste. The leteči_predmeti vektor je vektor primerkov objekta in za zanka prečka vektor in pokliče leteti metoda na primerih.

Implementacija polimorfizma v Rust

Razred ali vrsta je polimorfen, če več vrst predstavlja vmesnik. Ker lastnosti zagotavljajo funkcionalnost za definiranje vedenja v Rustu, hkrati pa zagotavljajo skupni vmesnik za pisanje generične kode, lahko lastnosti uporabite za implementacijo polimorfizma.

Tukaj je lastnost z imenom Risanje ki definira vedenje za upodabljanje predmetov na zaslonu:

lastnostRisanje {
fnpripraviti(&sebe);
}

Tipi, ki izvajajo lastnost Drawable, lahko dostopajo do pripraviti funkcijo.

structPravokotnik {
premer: u32,
višina: u32,
}

impl Risanje za pravokotnik {
fnpripraviti(&sebe) {
// Upodobitev pravokotnika na zaslonu
}
}

Napišete lahko generično kodo, ki riše predmete, ki izvajajo Risanje lastnost.

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

The risanje_predmeta funkcija ima generični tip T kot vhod, ki izvaja Risanje lastnost in kliče pripraviti metoda na lastnost. Različni predmeti lahko izvajajo Risanje lastnost in dostop do funkcionalnosti.

Implementacija abstrakcije v Rust

Abstrakcija je OOP koncept kjer so razredi in vmesniki dostopni določenim objektom in vrstam. Abstrakcijo lahko implementirate v Rust z lastnostmi.

Tukaj je primer lastnosti predvajalnika medijev:

lastnostMediji {
fnigrati(&sebe);
}

Strukture in enume, ki izvajajo Mediji lastnost mora zagotoviti izvedbo za igrati metoda.

structPesem {
naslov: Vrvica,
umetnik: Vrvica,
}

impl Mediji za Pesem {
fnigrati(&sebe) {
println!("Predvajanje pesmi: {} izvajalca {}", sebe.naslov, sebe.umetnik);
}
}

The Pesem struct izvaja Mediji lastnost z zagotavljanjem izvedbe za igrati metoda, ki natisne sporočilo s polji Pesem struktur na konzolo.

fnglavni() {
// Ustvari primerek strukture Song
pustiti pesem = Pesem {
naslov: Vrvica::od("Bohemian Rhapsody"),
umetnik: Vrvica::od("Kraljica"),
};

// Pokliči metodo predvajanja na primerku pesmi
song.play();
}

The pesem spremenljivka je primerek Pesem struct, spremenljivka pa lahko dostopa in kliče igrati metoda.

Organiziranje Rust Code je preprosto

Objektno usmerjeno programiranje pomaga pri organizaciji kode. Zahvaljujoč sistemu modulov Rust lahko preprosto organizirate svojo kodo Rust, medtem ko izvajate koncepte OOP za svojo aplikacijo, da bo vaša koda organizirana, obvladljiva in intuitivna.