Objektorienteeritud programmeerimise (OOP) mõisted ja ajalugu
Objektorienteeritud programmeerimine (OOP) on programmeerimise paradigma, mille puhul keskendutakse andmete ja funktsioonide grupiseerimisele objektideks, millel on omadused (atribuutide väärtused) ja tegevused (meetodid). OOP kasutab mõisteid nagu pärimine, abstraktsioon, kapseldamine, polümorfism ja liidesed.
OOP ei olnud 1990. aastate alguses tarkvaraarenduses veel laialdaselt levinud, kuid tänapäeval on enamikke populaarseid programmeerimiskeeli (nt C#, Java, Python) OOP-l põhinevad.
Põhilised ideed ja mõisted
- Klass
- Mis on klass?
Klass on mall või plaan, mille järgi luuakse objekte. Klass määrab objekti omadused (väljad) ja tegevused (meetodid). Näide:public class Inimene { public string Nimi; public int Vanus; public void Tervita() { Console.WriteLine("Tere! Mina olen " + Nimi); } }
- Mis on klass?
- Pärimine (Inheritance)
- Mis on pärimine?
Pärimine võimaldab luua uusi klasse olemasolevate klasside põhjal. Alamklass pärib kõik ülemklassi omadused ja meetodid, kuid saab neid laiendada või muuta. Näide:public class Töötaja : Inimene { public string Ametikoht; public void Töötan() { Console.WriteLine($"{Nimi} töötab ametikohal {Ametikoht}."); } }
- Mis on pärimine?
- Abstraktsioon (Abstraction)
- Mis on abstraktsioon?
Abstraktsioon peidab keerulise loogika ja kuvab ainult olulised detailid. Abstraktsed klassid või liidesed määravad, mida objekt teeb, kuid mitte, kuidas seda tehakse. Näide (abstraktne klass):public abstract class Loom { public string Nimi; // Abstraktne meetod public abstract void TeeHääl(); } public class Koer : Loom { public override void TeeHääl() { Console.WriteLine("Auh-auh!"); } }
- Mis on abstraktsioon?
- Kapseldamine (Encapsulation)
- Mis on kapseldamine?
Kapseldamine tähendab, et andmed peidetakse otse ligipääsu eest ja neid saab muuta vaid kontrollitud meetodite kaudu. See aitab andmete terviklikkuse tagamisel. Näide:public class Pank { private double saldo; public double Saldo { get { return saldo; } set { if (value >= 0) saldo = value; } } }
- Mis on kapseldamine?
- Liides (Interface)
- Mis on liides?
Liides kirjeldab ainult meetodite allkirjad – see määrab, mida objektid peavad tegema, kuid mitte, kuidas seda teha. Klass, mis rakendab liidest, peab liidese meetodid defineerima. Näide:public interface IHeliline { void TeeHääl(); } public class Kass : IHeliline { public void TeeHääl() { Console.WriteLine("Mjäu!"); } }
- Mis on liides?
Kasutusnäide: Isik – Õpetaja – Õpilane
Kasutame kõiki eeltoodud mõisteid (pärimine, kapseldamine, abstraktsioon ja liidesed) praktilises näites, kus meil on baasklass Isik, millel on kaks alamklassi Õpetaja ja Õpilane. Lisame ka liidese ITööline, mis määrab, et Õpetaja peab suutma arvutada oma palga.
1. Baasklass: Isik
Kapseldamine: Sünniaasta on privaatne väli, mille väärtust kontrollitakse setteris.
Abstraktsioon: Kirjelda() on abstraktne meetod, mis tuleb alamklassides üle kirjutada.
public abstract class Isik
{
private int sünniaasta;
public string Nimi { get; set; }
// Kapseldamine – sünniaasta kontrollimine
public int Sünniaasta
{
get { return sünniaasta; }
set
{
if (value > 1900 && value <= DateTime.Now.Year)
sünniaasta = value;
}
}
// Arvutatud omadus
public int Vanus => DateTime.Now.Year - sünniaasta;
// Abstraktne meetod
public abstract void Kirjelda();
}
2. Liides: ITööline
Liides ITööline määrab, et klass peab omama meetodit ArvutaPalk().
public interface ITööline
{
double ArvutaPalk();
}
3. Alamklass: Õpetaja
Pärimine: Õpetaja pärib Isiku omadused.
Liides: Õpetaja rakendab liidest ITööline ja arvutab oma palga.
public class Õpetaja : Isik, ITööline
{
public double Tunnitasu { get; set; }
public int TunnidNädalas { get; set; }
public override double ArvutaPalk()
{
return Tunnitasu * TunnidNädalas * 4; // kuutasu (4 nädalat)
}
public override void Kirjelda()
{
Console.WriteLine($"Õpetaja {Nimi}, vanus {Vanus}, teenib kuus {ArvutaPalk():F2}€");
}
}
4. Alamklass: Õpilane
Pärimine: Õpilane pärib Isiku omadused, kuid tal on oma spetsiifilised omadused nagu Kool ja Klass.
public class Õpilane : Isik
{
public string Kool { get; set; }
public int Klass { get; set; }
public override void Kirjelda()
{
Console.WriteLine($"{Nimi} on {Vanus}-aastane õpilane, õpib {Kool} {Klass}. klassis.");
}
}
5. Kasutusnäide programmis
public class Program
{
public static void Main()
{
Õpetaja õpetaja = new Õpetaja
{
Nimi = "Mari Maasikas",
Sünniaasta = 1985,
Tunnitasu = 20,
TunnidNädalas = 25
};
Õpilane õpilane = new Õpilane
{
Nimi = "Juku Jänes",
Sünniaasta = 2010,
Kool = "Tallinna Reaalkool",
Klass = 9
};
õpetaja.Kirjelda();
õpilane.Kirjelda();
}
}
Väljund:
Õpetaja Mari Maasikas, vanus 40, teenib kuus 2000,00€
Juku Jänes on 15-aastane õpilane, õpib Tallinna Reaalkool 9. klassis.
Kokkuvõte
Mõisted ja selgitused:
- Isik on abstraktne baasklass, mis sisaldab üldisi andmeid, nagu nimi ja sünniaasta. Kapseldame sünniaasta, et kontrollida, kas see on kehtiv.
- Õpetaja pärib Isiku ja rakendab ITööline liidese, et arvutada oma palk.
- Õpilane pärib Isiku ja lisab spetsiifilised omadused nagu kool ja klass.
- Liides määrab, et klass, mis rakendab ITööline, peab oskama arvutada oma palka.
- Kapseldamine, abstraktsioon ja pärimine aitavad hoida koodi puhtana ja kergesti hallatav.
Abstract klass vs Interface – peamised erinevused
| Omadus | Abstraktne klass (abstract class) | Liides (interface) |
|---|---|---|
| Eesmärk | Kirjeldab osalist käitumist ja struktuuri, mida saab jagada alamklassidega | Kirj |

