OOP – Objektens liv

Inledning

Objekt lever samma liv som deklarerade variabler. De skapas vid en deklaration, vid OOP brukar man säga att man skapar en instans av en klass, d v s ett objekt. Objektet kanske är deklarerad i en loop och finns således bara i själva loop’en. Det är viktigt att veta variablers och objekts räckvidder när man programmerar!

Det finns två viktiga stadier i ett objekts livscykel:

  • Konstruktion. När objektet skapas anropas klassens konstruktor-funktion automatiskt. Det måste alltid finnas minst en konstruktor-funktion om man ska skapa objekt från klassen.
  • Destruktion. När objektet förstörs behövs kanske låsta resurser frigöras, detta kan då ske i destruktor-funktionen. Denna funktion anropas automatiskt när objektet ?dör?. C# använder sig an en teknik som kallas Garbage Collection. Kortfattat kan man säga att den detekterar automatiskt objekt som ingen kan använda längre, samlar ihop dem och städar bort dem från minnet.

I C# anropas objektets konstruktor med det reserverade ordet new. T ex:


string myString = new string("Hej");

En klass kan även ha olika konstruktor-funktioner med olika parametrar. T ex:

string myString = new string("a", 10);

Denna konstruktor bygger upp en sträng med texten aaaaaaaaaa, d v s 10 upprepningar.

En viktig sak i C# är att objekt ”dör” inte direkt då man tycker att de borde försvinna. Detta sker först då ramverket utför sin skräpuppsamling (Garbage Collection), då anropas objektets destruktor. På så sätt kan man se destruktorn som objektets sista önskan innan det försvinner.

Gränssnittet IDisposable

IDisposable är ett interface (gränssnitt). Genom att använda IDisposable så måste klassen implementera en metod kallad Dispose(). Metoden är till för att frigöra resurser samt ta över kontrollen när detta sker.

Regel 1) använd en destruktor bara om du också tänker använda IDisposable . Vi nämner destruktorn främst för att den finns och används flitigt i andra språk.

Regel 2) använd IDisposable om din klass skapar/äger någon resurs som måste frigöras, t.ex. öppnade filer eller nätverksuppkopplingar.

IDisposable används automatiskt av språket C# om man använder using för att skapa och utföra saker i sin kod. Det finns mer att förklara inom detta område men det lämnas till en annan artikel.

Definiera medlemmar och klassmedlemmar

Det mesta ni har använt hittills har varit statiska medlemmar (static). Dessa har speciella egenskaper som gör att de delas mellan klasser av samma typ. Det innebär också att man inte behöver skapa ett objekt för att kunna använda statiska medlemmar. T ex:


Console.WriteLine()
Console.ReadLine()

Dessa funktioner kan du använda utan att skapa ett objekt av typen Console. Detta p.g.a. att de är deklarerade som static.

När skapade ni senast ett objekt av klassen Console? Svaret är aldrig. Det behövs helt enkelt inte då alla medlemsmetoder är statiska, d.v.s alla funktioner du brukar använda.

Klassmedlemmar är ett namn på allt som finns kodat i klassen, det kan vara variabler (medlemsvariabler) eller metoder (medlemsmetoder). Ordet medlem används bara för att markera att variabler/metoder hör till en viss klass.

Klassmedlemmarna kan deklareras som antingen private (privat) eller public (publik). Private innebär att bara klassen själv har rätt till att använda medlemmen, det kan vara en variabel men också en funktion. Public är då motsatsen och betyder att om jag skapar ett objekt så kan jag alltid komma åt alla publika (public) medlemmar ?utifrån? objektet.

Dags för några exempel

Exempel: Enkel klass
public class myClass
{
   public int i;
   private int j;
 
   public myClass()
   {
      //Konstruktor kod
   }
   ~myClass()
   {
      //Destruktor kod
   }
   public void DoSomething()
   {
      //Do Something?
   }
} 

Ovanstående exempel har både konstruktor och destruktor. I klassen finns även en public variabel i, och en privatevariabel j. Klassen innehåller även metoden DoSomething().

Skapa objekt

Att skapa objekt gör med det reserverade ordet new. Det finns inga begränsningar över hur många objekt man får ha eller av vilken typ de är. Det ser precis ut som en vanlig variabeldeklaration:


MyClass j = new MyClass();
MyClass k = new MyClass();
MyClass l = new MyClass("Hej");
MyClass m = new MyClass("Hej", 5);

I fallet ovan skapas 4 olika objekt (j, k, l och m) fast alla av samma typ (MyClass)!

De skapas även på 3 olika sätt med 3 olika konstruktorer. Detta är såklart förutsatt att dessa 3 olika konstruktorer är implementerade i klassen MyClass. Minns att man kan ha hur många olika konstruktorer som helst.

Att implementera betyder just att ”koda”, man ser till att det ”finns med”, man realiserar något.

Hur vet man vilken som anropas? Jo kompilatorn matchar konstruktorns inparametrar med det anropet man gör när man skapar ett objekt. Finns det ingen konstruktor som passar så kommer du få ett felmeddelande. Finns det 2 st konstruktorer med samma slags inparametrar så kommer kompilatorn inte att veta vilken du menar, du kommer få ytterligare ett fel, då det ej är tillåtet att ha två likadana konstruktorer i samma klass.

Använd ett objekt

bild

Jag skapar en klass genom att högerklicka på mitt projekt o välja Add->Class.

I klassen lägger jag till en privat medlemsvariabel j och en public variabel i samt en metod DoSomething().

Var noga med var du placerar dessa saker! Kolla koden nedan så ser du exakt hur detta borde se ut.

Exempel: MyClass.cs
class MyClass
{
    public int i =0;
    private int j = 0;
 
    public void DoSomething()
    {
        Console.WriteLine("I did something, btw i=" + i);
    }
}
bild

I min main-metod så skapar jag först ett objekt av min klass nu:

Jag ser vad jag kan göra med mitt objekt nu när jag har skapat det genom att använda variabelnamnet obj1. Efter att jag skrivit punkten så kommer listan upp som syns på bilden till vänster.

Du känner igen två saker här, i och DoSomething(). Vad hände med j? Jo variabeln j är privat så vi kommer inte åt den från objektet. Inne i klassen kan vi dock använda den. Den har blivit en intern variabel som bara klassen MyClass kan komma åt. Vi använder vårt objekt lite och ser vad som händer:


MyClass obj1 = new MyClass();
Exempel: Använda MyClass
MyClass obj1 = new MyClass();
obj1.i = 10;
obj1.DoSomething();
MyClass obj2 = new MyClass();
obj2.i = 20;
obj2.DoSomething();

Resultatet:

bild

Viktiga begrepp

  • instans/eng. instance
  • Konstruktion/eng. Construction
  • Destruktion/eng. Destruction
  • Garbage Collection/sv. skräpinsamling
  • statiska
  • implementera/eng. implement

Lämna ett svar

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

Scroll to top