Föreläsning 4″KLASSER, METODER & OBJEKT”

NTRODUKTION TILL KURSEN
KLASSER, METODER & OBJEKT
ME1453 – Introduktion till spelteknik
Blekinge Tekniska Högskola

DEN OBJEKTORIENTERADE VÄRLDEN
Hittils procedurellt
–    Data lagras i variabler som metoder arbetar på
–    Variabler och metoder är helt separata
–    Variabler skickas till metoder som arbetar på dem
–    Komplexa stora system            <—- problem och buggar
–    Måste skriva om mycket kod vid förändringar    <—- problem och buggar

Nu objektorienterat!
–    Kretsar kring objekt
–    Kombinerar variabler och funktioner till en enhet
–    Ett objekt!

Objektorientering är en metod för att avbildar verkligheten i en modell för programmering

Om vi abstraherar en smula kan vi faktiskt konstatera att allting i vår omgivning kan betraktas som objekt!

Objektorientering hjälper oss att strukturera komplexa problem på ett mer naturligt sätt i datorn – som annars skulle vara väldigt svåra att beskriva (programmera).

Ett objekt är, i verkligheten, ett enskilt föremål/sak, som har vissa funktioner och tillstånd.

Exempel:
–    Lampa, kan tändas och släckas (tänd/släckt)
–    Element, kan justeras (temperatur i celcius)
–    Bilar kan gasa och bromsa

I datorsammanhang stöter vi ofta på objekt som saknar direkt motsvarighet i verkligheten, t.ex. strängar.

Ett objekt har en bestämd livslängd: Det skapas, lever och används, för att sedan dö.
–    Plats resaveras i minnet, det används och frigörs sedan
–    Precis som variabler!

Objekt kapslar inte bara in variabler och funktioner till en enhet

Objekt kan användas för att ”gömma” data för andra objekt
–    Kallas ”Data hiding”

För att bearbeta data måste objektets metoder användas!
–    Data skickas in, behandlad data kommer ut

Hur det funkade inuti spelar ingen roll, bara det funkar
–    Väldigt bra då man ska samarbeta och programmera

Ni har redan använt objekt!
–    String
–    Console

Ta till exempel en bil
–    Du behöver t.ex. inte veta hur en motor funkar för att köra den…Eller?
–    Du behöver bara lära dig vad ratten, pedalerna och växelspaken används till
–    Alltså bilens ”metoder” (interface)!
–    Det samma gäller i den objektorienterade världen
–    Behöver inte alltid veta vad ett objekt faktiskt gör ”bakom kulisserna” för att använda det!

Objekt defineras av/skapas utifrån ‘klasser’

Klassen kan ses som en generell beskrivning eller ‘mall’ för hur objekten skall se ut.

Klassen är en abstrakt beskrivning medan objektet är en konkret representation av denna beskrivning

Ett objekt är en instans (förekomst) av en klass. Klassen listar alla de egenskaper/attribut man vill att ett objekt ska innehålla

Flera objekt av samma sort beskrivs av ‘samma gemensamma klass’

LITE SOM…

(BILDER!!!!!)

OSKAR OCH LISA
Oskar och Lisa är alla levande objekt – vi kallar dessa objekt: Människor

Vad har de gemensamt?
–    Oskar och Lisa är alla av ”typen” Människar.

Deras gemensamma egenskaper kan då beskrivas en klass!

Klassen Human (string name, uint age, string sex)

Objektet Oskar (name: Oskar, age: 19, sex: Man)
Objektet Lisa (name: Lisa, age: 22, sex: Woman)

De är alltså instanser av klassen ”human”

HUR SER EN KLASS UT?
Attribut motsvara av globala variabler i procedurell progammering.
‘Så som ni gjort innan!’

En metod fungerar på samma sätt som innan

Glöm inte att göra klassen ‘public’!
(mer om det senare!)

GLÖDLAMPAN
Tänk på ett antal lampor. Vad har de gemensamt?

Ta bort de oviktiga bitarna och lyft fram det som är intressant för detta fallat!

Alla lampor har en styrka (25W, 40W etc.) och en sockelstorlekt (E27, E14, B22)

Vilken datatyp bör dessa attribut ha?

EXEMPEL PÅ KLASSEN LAMP
Klassen Lamp bildar nu en komplex (sammansatt) typ som består av två attribut av olika ‘datatyp’

På så sätt har vi i vår klass samlat de attribut vi anser vara relevanta för en lampa

public class Lamp
{
public uint watts;
public string socket;
}

METHODS! METHODS!
I en klass har vi, förutom data, även metoder för att få något gjort med ett objekt av klassen
Vi definerar vilka operationersom är tillåtna

Operationerna beskrivs som ‘metoder’ i klassenb
–    Vilka metoder?
–    Beror på vad det är för sorts objekt
–    Vilka attribut det innehåller
–    Hur vi tänkt använda denna typ av objekt

VAD SKA MAN HA DOM TILL DÅ RÅ?
För vå renkla lampa skulle vi kunna tänka oss operationerna tänd och släck.

Lampan måste hålla reda på om den är tänd eller släckt, attribut (variabel) behövs.

Om vi sen ska avgöra om lampan är tänd eller släckt, behöver vi bara kika på detta värde!

Vilken ‘datatyp’ bör detta attribut ha?

public static void main(agrs….)
{
bool lit;

TurnOn();
}
public void TurnOn()
{
lit = true;
}

NEW OPERATORN
I alla högnivåspråk så finn det en operator som skrivs som ‘new’, Det är new-operatorn.

New operatorn används för att skapa objekt från klasser och aatt anropa den så kallade ‘Konstruktorn’!

Det som sker är att programmet ber om minnesplats från datorn för att lägga data på…

…den data som läggs där är det som står beskrivet i klassen som objektet skapas utifrån.

Ett objekt skapas utifrån en klass på det här sättet:
–    Class1 oneUniqueObject = new Class1();

I C# så kan nästan allt skapas med new-operatorn.

T.ex. så går det att skapa en int så här:
–    int myNumber = new int();

Gör helst inte så med ‘ValueTypes’ utan att först ha läst på vad det innebär!

THIS-OBJEKTET
I de flesta högnivåspråk finns även ett uttryck kallat this, self eller något liknande.

I C# så kallas uttrycket för ‘this’ och är till för att ett objekt ska kunna använda eller anropa sina egna attribut och metoder

Väldigt användbart för att skilja mellan vad som är parametrar och vad som är attribut i klassen

PUNKTNOTATION
Metoder användes genom punktnotation

Med punktnotation så menas den punkt som skrivs efter identifieraren

Exempel:
FighterShip ship = new FighterShip();
ship.name = ”Ludde”;
ship.ammo = 1000;
ship.hitPoints = 60;

VARDE LJUS!
När vi nu ska använda vår lampa så skapar vi ett objekt av klassen
–    Lamp myLamp = new Lamp();

För att sätta/läsa egenskaperna:
–    myLamp.watts = 60;
–    myLamp.socket = ”E27″;

–    Console.WriteLine(”Lamp socket {0}”, myLamp.socket());

För att tända lampan:
–    myLamp.TurnOn();

UNIKHET!
Varje objekt är unikt!

Varje objekt har en egen unik uppsättning av de attribut som finns deklarerade i klassen

En ändring i en instans kallad myLamp påverkar alltså inte en instans kallad youtLamp

MÄRKLIGHETER
Det vore lite konstigt om vi kunde förändra en lampas sockel helt som vi vill, från normal (E27) till smal E14).
–    myLamp.socket = ”E27″;
–    myLamp.socket = ”E14″;

Eller ännu värre:
–    myLamp.socket = ”Nisse Hult”;

Lampobjektet kan inte få förändras hur som helst! Hutlöst!

Vi måste på något sätt kunna kontrollera hur lampas tillstånd kan/får förändras!

ENCAPSULATION
Grundläggande teknik inom objektorienteriung för att kunna

Attribut ska inte kunna användas direkt utanför klassen, klassens interna struktur ska döljas.

Använd ‘privata’ attribut

‘Enkelhet!’ Det ska vara enkelt att använda en klass även om det har ett komplext inre!

Gränssnitt uppbyggt av publika metoder.

Klassmedlemmar har, om inget annat anges, privat synlighet.

___

KLASSEN LAMAP, V3

public class Lamp

{

Private uint watts;

private string socket;

private bool lit;

public void TurnOn()

{

Lit = true;

}

 

Public void TurnOffn()

{

Lit = fales;

}

}

____

PRIVATE I PRAKTIKEN

Ingen förändring är således möjlig direkt i den privata variabeln

utanför ett objekt av klassen

 

Vi kan alltså inte längre ändra sockeln:

myLamp.socket = ”E27″; // Ger kompileringsfel

 

Vi kan inte heller läsa av sockeln:

Console.WriteLine(”socke”{0}”, myLamp.socket());

 

Om det är relevant för användandet av objektet, kan vi skapa metoder eller properties för att hämta och sätta värdet på sockeln

 

I detta fall är det nog ologiskt att kunna förändra sockeln.

 

 

klassen lamp, v4

public class Lamp
{
private uint watt;
private string socket;
private bool lit;

public void TurnOn()
{
lit = true;
}

public void TurnOff()
{
lit = false;
}

public bool lsLit()
{
return lit;
}

}

 ÅTERKOMSTMETODER & PROPERTIES

Eftersom metoder ska användas när operationer gör ett objekt så kan det bli omständigt att skapa funktionalitet för åtkomst till attribut i objektet

public class Lamp
{
private uint watts;
private string socket;
private bool lit;

public uint GetWatts()
{
return watts;
}

public void SetWatts(uint watts)
{
this.watts = watts
}

}

 

HUR INITIERAR VI OBJEKTET?

Eftersom alla attribut nu är private så kan vi inte heller ge dem något initialt värde!

 

Vi måste på något sätt kunna tala om, när vi skapar objektet, vilka värden vi vill sätta, t ex 60W, E27.

 

En lösning är att skapa metoder som sätter attributen, ungefär som metoden TurnOn().

Men detta är både klumpigt och ologiskt, eftersom det egentligen inte går att tillverka en lampa som saknar både styrka och sockel (!)

 

Objektet måste ges sitt initiala tillstånd när det skapas!

 

Vi väljer därför att skapa en s k konstruktor i klassen.

 

 ATT SKAPA EN LAMPA

Vi skulle nu på ett mer naturligt sätt kunna dynamiskt skapa ett objekt av lampan.

Lamp myLamp = new Lamp(60, ”E27″);

 

Objektet myLamp initieras nu med de värden vi väljer att skicka in till konstauktorn och standardvärdet false i attributet lit.

 

På så vis ser vi till att vi inte har några ”döda” eller ologiska objekt, utan kan ge dem ett tillstånd direkt när de ”föds”.

 

KONSTAUKTORN

Konstruktor heter likadant som klassen och lämnar inget värde (inte ens void)

 

Det kan däremot ta emot parametrar

 

Konstruktion bör skrivas så att den garanterar att objektet får ett bra tillstånd vid skapandet.

 

Alla medlemsvariabler bör tilldelas ett strandvärde!

 

THE GARBAGE COLLECTOR