Tölvunarfræði/Klasi

Úr Wikibókunum

Klasi (e. class) í hlutbundinni forritun er lýsing á því hvernig tilvik (e. instance) hans eiga að vinna. Klasi á sér eigindi (e. property) sem geta bæði verið gögn (e. data) og aðgerðir (e. method). Tilvik af klasa er yfirleitt kallað hlutur (e. object).

Einfaldur klasi[breyta]

Til að skilja hvernig klasar virka skulum við búa til klasan bíll. Gögn klasans væru þá td. af hvaða tegund bílinn er, hvernig hann er á litinn og hversu margra gíra hann er. Aðgerðir klasans geta verið að skipta um gír, keyra og bremsa. Í C++ yrði þessi klasi svona:

class Bill {
	String tegund;
	String litur;
	int girar;

	void skipta_um_gir (int gir) {
		// Kóði sem skiptir um gír
	}
	void keyra() {
		// Kóði sem lætur bílinn fara áfram
	}
	void bremsa() {
		// Kóði sem lætur bílinn bremsa
	}
}

Til að búa til nýtt tilvik af klasanum (nýjan bíl).

Bill minnBill = new Bill();
minnBill.tegund = Toyota;
minnBill.litur = Rauður;
minnBill.girar = 5;

Þá erum við komin með tilvikið minnBill af klasanum Bill sem hægt er að keyra, bremsa og skipta um gír á.

Smiðir[breyta]

Í dæminu hérna fyrir ofan notuðum við fjórar línur af forritskóða til að búa klasan til og stilla gögnin hans. Til að auðvelda okkur að búa til nýtt tilvik af klasanum notum við smið (e. constructor) þar sem hægt er að gera þetta allt í einni línu. Smiður inniheldur kóða sem er keyrður þegar að tilvik af klasanum er búið til. Smiður hefur ekkert skilagildi. Smiðir geta tekið færibreytur (e. parameters) sem eru notaðar til þess að stilla gögn klasans.

Í C++ er smiðurinn fall sem hefur sama nafn og klasinn sem hann er í og hægt er að skilgreina hvaða fjölda sem er af smiðum svo lengi sem þeir eru einstakir (e. uniqe), það er að færibreytulisti þeirra verður að vera einstakur. Ef að engir smiðir eru skilgreindir mun þýðandinn sjálfkrafa búa til breytulausan smið. Smiðir eru ekki erfanlegir.

Public og private eigindi[breyta]

Klasar geta innihaldið gögn og aðgerðir sem forritarinn sem skrifaði klasann vill ekki að sá sem er að nota hann geti breytt. Til dæmis ætti ekki að vera hægt að breyta um tegund á bíl eftir að búið er að búa hann til. Hægt er að verja gögn og aðferðir klasa í mörgum forritunarmálum með því að skilgreina hvort þær eru public, protected eða private. Public eigndi eru aðgengileg öllum, það er hægt að kalla á aðgerðir og gögn utan klasans beint. Í dæminu okkar með bílinn hér á undan er ekki skilgreint hvort eigindi klasans séu public, protected, eða private og þau eru því sjálfkrafa skilgreind sem public. Það gerði það að verkum að við gátum stillt Tegund ofl. með því að kalla beint í viðkomandi breytur (e. variables) innan klasans. Protected eigindi eru aðeins aðgengileg innan klasans sjálfs og undirklasa. Það er eingöngu hægt að nota protected gögn og aðgerðir sem eru skilgreind í föllum innan sama klasans eða undirklasa, ekki er hægt að kalla í þau utan klasans. Sama gildir um private eigindi, fyrir utan að þau er ekki hægt að nota í undirklösum.

Það er af mörgum talin góð vinnubrögð að hafa öll gögn klasa private. Það gerir það að verkum að sá sem skrifar klasan getur séð fyrir hvernig hann mun verða notaður og sá sem notar hann þarf ekki að hafa áhyggjur af því að nota eigindi sem forritari klasans ætlaðist til að yrðu bara notuð innan hans. Ef það á að vera hægt að breyta gögnum klasa utan hans er hægt að búa til sértök get og set föll sem hafa bara það hlutverk að sækja og breyta gögnum.

Eigindum klasa er lýst sem public ef það á að vera hægt að nota þau í utan klasans, þ.e öðrum kóða en verið er að vinna með innan klasans. Þetta er algengt þegar að forritasöfn (e. libraries) eru búin til.

Þetta einfaldar líf forritarans, og getur auðveldað honum hönnunina á forritskóðanum. Þessi leið gerir honum kleift að hafa betri yfirsýn yfir verkefnið sem hann vinnur í án þess að þurfa að vera að hafa áhyggur af því hvernig klasinn sem hann vísar í er útfærður. Með því að brjóta forritið niður er auðveldara að hafa yfirsýn yfir hvað er verið að gera hverju sinni og þar af leiðandi verða mistök hjá forritaranum ekki eins alvarleg þegar þau koma upp.

Þegar við erum búin að bæta þessum aðferðum við Bill klasann lítur hann svona út:

class Bill {
	private:
		String tegund;
		String litur;
		int girar;

	public:
		Bill ( String tegund_inn, String litur_inn, int girar_inn) {
			tegund = tegund_inn;
			litur = litur_inn;
			girar = girar_inn;
		}

		void skipta_um_gir (int gir) {
			// Kóði sem skiptir um gír
		}

		void keyra() {
			// Kóði sem lætur bílinn fara áfram
		}

		void bremsa() {
			// Kóði sem lætur bílinn bremsa
		}
}


Til að búa til nýtt tilvik af klasanum (nýjan bíl).

Bill minnBill = new Bill(Toyota, Rauður, 5);

Hérna gátum við búið til tilvik af klasanum í einni línu með því að nota smiðinn.

Erfðir[breyta]

Erfðir eru mikið notaðar í hlutbundinni forritun til að nýta eigindi klasa í undirgerðum hans. Ef við höldum áfram með dæmið um bílinn þá geta bílar haft mismunandi eiginleika. Vörubíll getur til dæmis sturtað úr vagninum sínum, en það væri samt ekki rétt að setja sturta fallið á fjölskyldubíl sem er ekki með neina aðgerð sem tengist því að sturta. Þeir hafa samt ýmsa sameiginlega eiginleika áfram eins og að keyra, bremsa o.s.frv. Í stað þess að þurfa að endurtaka þessar aðgerðir aftur og aftur í klösum fyrir misnunandi bíla höfum við bíl sem yfirklasa og búim til undirklasa eins og Vorubill, Fjolskyldubill og Kranabill.

  • Public erfðir: Public og protected meðlimabreytur og aðgerðir grunnklasa verða public og protected í klasa sem erfir frá grunnklasanum.
  • Protected erfðir: Public og protected meðlimabreytur og aðgerðir í grunnklasa verða protected í klasanum sem erfir frá grunnklasanum.
  • Private erfðir: Public og protected meðlimabreytur og aðgerðir grunnklasans eru private í klasanum sem erfir frá grunnklasanum.