Klasser – En introduktion

Inledning

Det är inte alltid det går att börja förklara grundläggande begrepp som kräver djupare förståelse när programmering ska läras ut. Klasser kan vara ett sånt begrepp som gärna får mogna lite innan man tar itu med det. Det finns så många andra saker som ska tränas först, t.ex. variabler, if-satser, loop'ar, metoder, etc.

Undervisning inom programmering följer ofta en kronologisk ordning. Först förklaras grunderna som återfinns i tidiga språk som t.ex. C. Sedan när grunderna sitter så tar man steget till att förklara de bitar som kommer från objektorienterad programmering, även kallad kort OOP (Object Oriented Programming). OOP fick en bred spridning med språk som C++ och Java redan tidigt 90-tal. Syftet med OOP var att lyfta programmeringen en nivå och göra OOP-språken mer kraftfulla. Samtidigt introduceras helt nya begrepp och sätt att tänka kring programmering som också kan vara en aning abstrakta ibland.

C# är ett väldigt modernt OOP språk där det finns, redan från dag 1, fullt med OOP detaljer som en nybörjare helt enkelt får ignorera i början.

Ett grundläggande begrepp inom OOP är just klasser och vi ska förklara detta på grundläggande nivå med fokus på datahantering.

En första klass

För att göra vår genomgång lite mer verklig så ska vi utgå från ett väldigt enkelt exempel. Vi tänker oss att vi ska mata in olika personers antal arbetade timmar samt inkomst och räkna ut den timlön som blir. En början på detta (utan någon som helst felhantering) kan se ut såhär:

Exempel 1

class Program
{
	static void Main(string[] args)
	{
		Console.Write("Ange ditt namn: ");
		string namn = Console.ReadLine();
		Console.Write("Ange din inkomst: ");
		int inkomst = int.Parse(Console.ReadLine());
		Console.Write("Ange antal timmar: ");
		int timmar = int.Parse(Console.ReadLine());

		Console.WriteLine("Din timlön blev: " + (inkomst / timmar) + " kr/h");

		Console.ReadKey();
	}
}

bild

Nu ska vi se på exemplet med nya ögon. Vi hanterar en mängd data. Vi bör ställa oss frågan om dessa data kanske hör ihop?

Vi tänker oss att både namn, inkomst och timmar skulle kunna bakas ihop till någon slags InkomstInfo. Detta kan vi göra genom att skapa klassen InkomstInfo.

Högerklicka i projektet i Solution Explorern och välj "Add"->"Class". Namnge filen som InkomstInfo.cs. Även om man kan deklarera flera klasser i samma fil så rekommenderar vi en enkel regel tills vidare; en klass, en fil!

Nästa steg blir att få in all data vi vill ha i klassen InkomstInfo.cs. Detta gör vi genom att deklarera publika (public) egenskaper i klassen. En egenskap, eller property på engelska, är data som har en get och/eller en set deklarerad. När vi är klara ser filen ut som:

InkomstInfo.cs

namespace IntroKlasser
{
    class InkomstInfo
    {
        public string Namn { get; set; }
        public int Inkomst { get; set; }
        public int Timmar { get; set; }

        public int Timlön { get { return Inkomst/Timmar; } }
    }
}

Vi har också deklarerat en beräknad egenskap som endast har en get-del som inte är tom. Deklareras ett get-block så måste det returnera ett värde, ungefär som en metod. Timlönen beräknas enkelt med inkomsten dividerat med antalet timmar.

Vi har nu samlat den data som hör ihop samt lite logik i form av beräkningen av timlön i samma klass. Nu är det dags att använda klassen!

Vad är en klass?

En klass är som en mall eller ritning som används när objekt av klassen sedan skapas. Låter konstigt? Du kan också se det som att du skapat en egen datatyp genom att deklarera en klass. Varje objekt som sedan skapas kommer att fungera, och ha plats för all den data du bestämt, enligt mallen. Precis som du kan deklarera int-variabler kan du nu deklarera InkomstInfo-variabler. Hur många du vill och kan tänkas behöva.

När objekt skapas från klasser så använder man nyckelordet new klassnamn. Det betyder "ge mig en ny instans av typen klass". Ordet instans betyder ett objekt av en viss typ. När en ny instans skapas så kan man säga att en ny kopia skapas.

Så istället för att deklarera en massa lösa variabler i vårt exempel så kan det nu skrivas om till att använda klassen InkomstInfo.

Exempel 2

    class Program
    {
        static void Main(string[] args)
        {
            InkomstInfo info = new InkomstInfo();

            Console.Write("Ange ditt namn: ");
            info.Namn = Console.ReadLine();
            Console.Write("Ange din inkomst: ");
            info.Inkomst = int.Parse(Console.ReadLine());
            Console.Write("Ange antal timmar: ");
            info.Timmar = int.Parse(Console.ReadLine());

            Console.WriteLine("Din timlön blev: " + info.Timlön + " kr/h");

            Console.ReadKey();
        }
    }

Allt är klasser

Varför är det så viktigt med klasser?

Till att börja med så är allt klasser i någon mening i C#. Ett nytt Console Application skapar en ny klass döpt till Program där metoden Main återfinns.

Inom OOP pratas det ofta om design. Att kunna identifiera vilka delar som hör ihop och som bör ingå i en klass är ett viktigt första steg. Med mer OOP finesser framöver så kan designen bli mer avancerad.

Fördelar med klasser är t.ex.:

  • Koden blir mer strukturerad och lättläst. Förutsatt att man gjort en vettig design.
  • Klasser kan samlas i ett s.k. klassbibliotek och på så vis enklare återanvändas i andra projekt.
  • Oftast blir det enklare att bygga vidare och uttöka programmet.

I vårt exempel ovan så skulle vi nu enkelt kunna skapa en List som håller typen InkomstInfo. På så vis skulle vi enkelt kunna lagra många objekt av typen InkomstInfo. All data skulle sedan relativt enkelt kunna sparas i en databas. Detta kan vi enkelt göra nu om då datan hör ihop via klassen InkomstInfo. Om vi utgår från Exempel 1 så hade vi behövt en lista med namn, en lista med inkomst och en lista med timmar. Hanteringen hade blivit mycket jobbigare och risken för fel hade blivit större.

Avslutning

Detta är en introduktion till klasser där vi främst koncentrerat oss på att samla data i en egendefinierad klass. Vi har på så vis skapat oss en egen datatyp. Det är viktigt att veta att alla klasser, hur avancerade de än är, är byggda på mycket enkla byggstenar.

Det krävs en anpassning i sitt tankesätt för att kunna se allt som klasser och till slut se hela OOP som användbara verktyg. Nedan finns en videogenomgång samt några övningar.

Videogenomgång

Övningar

Övning 1

Skapa en klass som representerar en bil. Förutom märke och modell så lägger du själv till ytterligare 3 egenskaper som beskriver en bil.

Skriv sedan ett kort exempel där du skapar en ny bil, fyller objektet med data och sedan skriver ut datan.

Övning 2

Skapa en klass som innehåller data för för- och efternamn, dvs. två string. Skapa också en beräknad egenskap som returnerar förnamn + efternamn.

Avsluta med att skriva ihop ett exempel där du använder klassen och visar att den fungerar.

Övning 3

Bygg vidare på övning 2. Lägg till en egenskap av typen DateTime som beskriver födelsedatum.

Lägg till en ny beräknad egenskap av typen bool som returnerar true om personen är myndig (minst 18 år gammal).

Övning 4

Bygg vidare på övning 3. Lägg till egenskaper för höjd och vikt. Använd lämplig datatyp.

Lägg till ytterligare en beräknad egenskap kallad BMI. Använd formeln för BMI (Body Mass Index), BMI = vikten / (längden * längden).

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *

Scroll to top