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