Adriana Pikaljov Portfoolio

en_GBet

OOP põhialused

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

  1. 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); } }
  2. 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}."); } }
  3. 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!"); } }
  4. 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; } } }
  5. 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!"); } }

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

OmadusAbstraktne klass (abstract class)Liides (interface)
EesmärkKirjeldab osalist käitumist ja struktuuri, mida saab jagada alamklassidegaKirj