Klasi (forritun)

**Klasi** er eining í hlutbundinni forritun sem gegnir hlutverki sniðmáts. Klasi ákveðins hlutar lýsir eiginleikum og aðgerðum tilviks hans. Taka má sem dæmi klasann `Bíll` sem hefði að geyma upplýsingar um lit og gerð bílsins sem og fjölda hurða og dekkja. Þegar klasinn er í hendi er má búa til mörg tilvik af honum með mismunandi eiginleika, tilvik af grænum bíl með 4 hurðir og 15 dekk eða rautt tilvik 2 hurðir og 4. 

## Ástæður
Klasar brjóta forrit niður svo auðveldara sé að vinna með þau. Meginreglan er að skipta forritinu niður í einingar sem eru hannaðar á þann veg að breyting í einum klasa hafi sem minnst áhrif á aðra hluti forritsins til þess að auðvelda okkur smíði stórra kerfa. Hentugast er að reyna að gera almenna klasa sem hægt er að endurnýta þegar sömu virkni vantar í önnur verkefni. Til þess að ekki þurfi að skrifa klasa sem er þegar til, og einnig til að nýta klasa sem búið er að prófa út í gegn og vitað að virkar mjög vel.

### Klasaskil
Klasi getur til dæmis séð um tengingu við gagnagrunn. Þá nota aðrir klasar hann til að hafa samskipti við gagnagrunninn. Klasar geta haft samskipti sín á milli beint eða í gegnum skil. Skil eru notuð sem skilgreiningarhluti á klasa til að auðvelda samskipti milli forritunareininga innan forrits.

## Dæmi

Dæmi í Java: Klasinn `Maður` og klasinn `KarlMaður` sem erfir klasann `Maður`. Það þýðir að kall í klasann `KarlMaður` getur nýtt aðferðir sem eru skilgreindar í klasanum `Maður`:


```java
public class Maður {
    public void VeifaHöndum() {
    //aðferð til að veifa höndum
    }
}

public class KarlMaður extends Maður {  //extends er skipunin í java sem segir ''erfir''
    public void LataVaxaSkegg() {
    //Aðferð til að láta skegg vaxa
    }
}

public static void main(string Args[]) {
    KarlMaður karlMaður = new KarlMaður();
    karlMadur.VeifaHöndum();  
    karlMaður.LataVaxaSkegg();
}
```


Klasinn sem erfir getur framkvæmt aðgerðir og notað breytur sem eru í erfðum klasa sem eru skilgreindar sem public eða protected en ekki ef skilgreiningin private er notuð. Í dæminu að ofan ef aðgerðin VeifaHöndum() væri skilgreind svona: private void VeifaHöldum() þá hefði klasinn KarlMaður ekki aðgang að aðgerðinni og forritsstubburinn að ofan væri ólöglegur.

Á sama hátt er hægt að láta skil erfa skil en skil geta ekki erft klasa og klasi getur ekki erft skil.

Dæmi um klasa í Python:


```python
class Maður:
    "Manneskja með sál og hjarta."
    def __init__(sjálf, nafn, aldur):
        sjálf.nafn = nafn.capitalize()
        sjálf.aldur = aldur
    def kynning(sjálf):
        print("Komið sæl, ég heiti {0} og er {1} ára.".format(sjálf.nafn, sjálf.aldur))

Anna = Maður("anna", 26)
print("Nafn:", Anna.nafn)       # Prentar „Aldur: 26“
print("Aldur:", Anna.aldur)     # Prentar „Nafn: Anna“
Anna.kynning()                  # Prentar „Komið sæl, ég heiti Anna og er 26 ára.“
```


## Private, protected, og public
Klasar og klasabreytur geta verið skilgreind sem *public*, *private* or *protected*. Þessir valmöguleikar skilgreina aðgengið í klasann. 

*Private* þýðir að aðeins föll sem eru í klasanum sjálfum fá aðgang. 

*Protected* leyfir klasanum sjálfum og öllum undirklösum að fá aðgang.

*Public* þýðir að allir fá aðgang, hann er alveg opin fyrir öllum. 

**Hugrænn klasi** gengur út á það að hægt sé að skilgreina uppbyggingu klasans, segja hvaða breytur og föll hann inniheldur án þess að útfæra vinnuna sjálfa. Þeir sem að erfa hugræna klasa verða að útfæra þau föll sem að eru ekki útfærð í hugræna hlutanum. Hugrænn klasi er ekki eiginlegur klasi; Hann gerir ekki neitt og er bara notaður til að samnýta eiginleika milli klasa.

Þegar skilgreindur er **hlutrænn klasi** þá vita þeir klasar sem að erfa hann ekki hvernig hann útfærir hlutrænu föllin.

Hérna er eitt dæmi í C++, klasi sem við köllum `Hello` er gerður með smið sem tekur inn streng. Þegar við köllum á fallið `Say()` þá mun tilvik af `Hello` prenta `Hello{what}` á skjáinn.


```cpp
using System;
public class Hello
{
    private string what;
    public Hello(string s)
    {
        what = s;
    }    
    public void Say()
    {
        Console.WriteLine("Hello " + what + "!");
    }
}
public class Program
{
    public static void Main(string[] args)
    {
        Hello helloWorld = new Hello("world");
        helloWorld.Say(); // prenta "Hello world!" á viðmótinu
    }
}
```


## Sjá einnig
* Erfðir
* Grunnklasasafn
* Smiður

## Heimildir
* 

## Tilvísanir