Lektion 10 (19 sep)

Inkapsling (encapsulation)

Läsanvisningar

Instruktioner

När man jobbar med properties kan det vara användbart att justera debuggern så att "Step Into" stegar in i properties. För att göra detta, följ instruktionerna på MSDN under rubriken "To enable stepping into properties and operators".

Övningar

Lösningsförslag

I samtliga övningar nedan, tänk på att ogiltiga tillstånd aldrig ska vara möjliga, inte ens direkt efter att ett objekt har skapats (vilket konstruktorer vid behov kan användas för att garantera).

Utöver dessa övningar som handlar om enbart inkapsling finns även de stående övningarna som innefattar många olika moment.

  1. Skriv en klass för personer med ett fält för ålder (inga fler behövs för denna övning) som inte tillåter åldrar under noll år. Om man någonsin försöker sätta åldern till ett lägre tal ska ett fel kastas. Följande kod ska alltså få ett fel att kastas:
    1. Person person = new Person
    2. {
    3. Age = 20
    4. };
    5. person.Age = -5;
  2. Skriv en klass för bankkonton med metoder som tillåter insättning när som helst men uttag enbart när det finns nog med pengar på kontot. Om det inte finns nog med pengar för uttag ska ett fel kastas. Följande kod ska alltså få ett fel att kastas:
    1. Account account = new Account();
    2. account.Deposit(500);
    3. account.Withdraw(700);
    • Skriv en variant som alltid tillåter uttag men lägger till en avgift på 100 kr varje gång som kontot övertrasseras. Exempelkoden ovan ska alltså inte kasta ett fel utan sluta med ett saldo på -300 kr: -200 kr efter uttaget och ytterligare -100 kr för övertrasseringen.
  3. Skriv en klass för "kvadratlika" rektanglar som har bredd och höjd men enbart tillåter rektanglar där bredden och höjden skiljer sig med högst 20 %. Följande kod ska alltså få ett fel att kastas:
    1. SquareLike s = new SquareLike(width: 100, height: 200);
    Medan följande kod ska vara giltig:
    1. SquareLike s = new SquareLike(width: 100, height: 110);
    • Skriv en variant som tillåter att man ändrar bredden och höjden i efterhand. Reglerna ska fortfarande gälla även i detta fall.
  4. Skriv en klass för temperaturer som kan användas med både Celsius och Fahrenheit och som automatiskt ändrar den ena så fort den andra ändras. Hitta konverteringsformlerna på nätet eller använd din lösning till övning 6 från lektion 1. Följande kod ska alltså skriva ut 212 följt av 0:
    1. Temperature t = new Temperature();
    2. t.Celsius = 100;
    3. Console.WriteLine(t.Fahrenheit);
    4. t.Fahrenheit = 32;
    5. Console.WriteLine(t.Celsius);