4621 Egenskaper
Detta är en långsam introduktion till egenskaper (eng.) properties.
Med hjälp av en spargris ska vi se olika sätt att arbeta med objektvariablerna.
Ett objektdiagram av spargrisen visas nedan.
spargrisen: Spargris
- ägare "Ada"
- belopp 45
Lista med önskemål
- Spargrisen måste ha en ägare
Del 1 - publika objektvariabler
Klassdiagram som gäller för det här exemplet visas nedan.
Spargris
- +ägare: String
- +belopp: int
- +Spargris()
Problem
new Spargris();
Ger en spargris utan ägare se objektdiagram nedan.
: Spargris
- ägare null
- belopp 0
Lösningen är att lägga till en konstruktor där ägaren måste anges, se nästa avsnitt.
Del 2 - konstruktor
Spargris
- +ägare: String
- +belopp: int
- +Spargris(namn: String)
Nu är koden
new Spargris();
ogiltig.
Istället skriver man:
new Spargris("Ada");'
Det ger objektet:
: Spargris
- ägare "Ada"
- belopp 0
Problem
Öskar:
- En spargris kan inte byta ägare
Nu kan man skriva (till exempel i klassen Test):
Spargris grisen = new Spargris("Ada");
grisen.ägare = "Beda";
Lösningen ligger i att göra ägare privat, samt lägga till en metod för att komma åt ägaren. Lösningen följer i nästa avsnitt.
class Spargris
{
private string ägare; // private istället för public
// kod utelämnad
public string GetÄgare()
{
return ägare;
}
// kod utelämnad
}
Fler problem
Spargris grisen = new Spargris("Ada");
// bökigt sätt att sätta in 10 kr
grisen.belopp = gisen.belopp + 10;
Lösning
class Spargris
{
// kod utelämnad
private int belopp; // ändra till private från public
// kod utelämnad
// lägg till metod för insättning
public void SättIn(int insättning)
{
// kontrollerar så att man ej kan sätta in negativa belopp
// det skulle bli ett uttag
if (insättning > 0)
{
belopp = belopp + insättning;
}
}
}
Spargris grisen = new Spargris("Ada");
// nedanstående kod är ogiltig, kompilerar ej
grisen.belopp = -100;
// sätter in på följande vis
grisen.SättIn(20);
Komplett kod finns i avsnittet nedan.
Del 3 - privata objektvariabler och metoder
Spargris
- -ägare: String
- -belopp: int
- +Spargris(namn: String)
- +GetÄgare(): string
- +GetBelopp(): int
- +SättIn(insättning: int): void
Del 4 - egenskaper (eng.) properties
Spargris
- -ägare: String
- -belopp: int
- +Spargris(namn: String)
- +Ägare: string
- +Belopp: int
- +SättIn(insättning: int): void
Kommentar till klassdiagrammet ovan. Tror inte att properties finns med i UML-standarden, men tänker att det bör skrivas som ovan.
I stället för att ge åtkomst till objektvariabler med getter-metoder kan man använda egenskaper (eng.) properties.
Nu gör man på följande vis för att läsa ägare.
Spargris grisen = new Spargris("Ada");
grisen.GetÄgare();
Ett alternativ är att ta bort metoden GetÄgare och ersätta den med följande kod:
public string Ägare
{
get
{
return ägare;
}
// private gör att man inte kan sätta värdet på ägare i klassen test
private set
{
ägare = value;
}
}
Istället för att komma åt ägare med
grisen.GetÄgare();
så skriver man:
grisen.Ägare;
Fördelen jämfört med att ha objektvariabeln ägare publik är att man till exempel som nu kan bestämma att man bara kan läsa ägares värde.
grisen.Ägare = "Beda";
är ogiltig kod eftersom det står private set
.
Sammanfattning
// kod i Test som finns före övrig kod nedan
// gäller alla exempel
Spargris grisen = new Spargris("Ada");
publika objektvariabler
class Spargris
{
public string ägare;
// kod utelämnad
}
// kod i Test
// läsa
grisen.ägare;
Console.WriteLine(grisen.ägare);
// skriva
grisen.ägare = "Beda";
get-metoder och privata objektvariabler
class Spargris
{
private string ägare;
// kod utelämnad
public string GetÄgare()
{
return ägare;
}
}
// kod i Test
// läsa
grisen.GetÄgare();
Console.WriteLine(grisen.GetÄgare());
// skriva
// kan inte byta ägare
// men kan om vi lägger till följande metod i Grisen
public void SetÄgare(string nyÄgare)
{
ägare = nyÄgare;
}
// då kan man byta ägare på följande vis
grisen.SetÄgare("Beda");
Egenskaper (eng.) properties
class Spargris
{
private string ägare;
// kod utelämnad
public string Ägare
{
get
{
return ägare;
}
private set
{
ägare = value;
}
}
}
// kod i Test
// läsa
grisen.Ägare;
Console.WriteLine(grisen.Ägare);
// skriva
// kan inte byta ägare
// men kan om vi ändrar till public set
// då kan man byta ägare på följande vis
grisen.Ägare = "Beda";