4621 Egenskaper

Detta är en långsam introduktion till egenskaper (eng.) properties.

Sammanfattning i pdf

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

  1. 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
  1. +Spargris()

Kod för Spargris på GitHub

Kod för Test på GitHub

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
  1. +Spargris(namn: String)

Kod för Spargris på GitHub

Kod för Test på GitHub

Nu är koden

new Spargris();

ogiltig.

Istället skriver man:

new Spargris("Ada");'

Det ger objektet:

: Spargris
  • ägare "Ada"
  • belopp 0

Problem

Öskar:

  1. 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
  1. +Spargris(namn: String)
  2. +GetÄgare(): string
  3. +GetBelopp(): int
  4. +SättIn(insättning: int): void

Kod för Spargris på GitHub

Kod för Test på GitHub

Del 4 - egenskaper (eng.) properties

Spargris

  • -ägare: String
  • -belopp: int
  1. +Spargris(namn: String)
  2. +Ägare: string
  3. +Belopp: int
  4. +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.

Kod för Spargris på GitHub

Kod för Test på GitHub

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";