Skip to content

Commit

Permalink
bring back override, add exercise on its removal
Browse files Browse the repository at this point in the history
  • Loading branch information
bjornregnell committed Jun 25, 2024
1 parent a8b98e1 commit 73c4496
Showing 1 changed file with 14 additions and 1 deletion.
15 changes: 14 additions & 1 deletion compendium/modules/w10-inheritance-exercise.tex
Original file line number Diff line number Diff line change
Expand Up @@ -292,13 +292,15 @@

\Subtask Öppna en editor och koda \code{trait Pair[T]} i en fil \code{pairs.scala}. Lägg dessutom till en konkret metod \code{tuple} i \code{Pair[T]} som returnerar en 2-tupel med de båda elementen i paret, så att det vid behov går att omvandla \code{Pair}-instanser till 2-tupler. Använd REPL för att testa att detta fungerar:
\begin{REPLnonum}
scala> val p = new Pair[Int] { val x = 10; val y = 20 }
scala> val p = new Pair[Int] { override val x = 10; override val y = 20 }
p: Pair[Int]{val x: Int; val y: Int} = $anon$1@784223e9

scala> p.tuple
val res0: (Int, Int) = (10,20)
\end{REPLnonum}

\Subtask Fungerar koden ovan även utan nyckelordet \code{override} (testa i REPL)? Varför? När \emph{måste} \code{override} användas? Vad är fördelen resp. nackdelen med att använda \code{override} även när det inte är nödvändigt?

\Subtask Skapa en case-klass \code{Dim} som ärver \code{Pair[Int]}. Instanser av denna klass kommer du att använda under veckans laboration för att representera en spelplans storlek genom att låta \code{x} ange antalet horisontella positioner och \code{y} antalet vertikala positioner.

Lägg även till ett kompanjonsobjekt \code{Dim} med en \code{apply}-metod som kan skapa \code{Dim}-instanser givet en 2-tupel.
Expand Down Expand Up @@ -367,6 +369,17 @@

\end{CodeSmall}

\SubtaskSolved
\begin{itemize}
\item Fungerar koden ovan även utan nyckelordet \code{override}? Varför?
\item[] Ja den fungerar eftersom \code{override} ej måste anges när ärvda \emph{abstrakta} medlemmar implementeras i en subtyp. Abstrakta medlemmar saknar implementation och det finns inget som behöver överskuggas.
\item När \emph{måste} \code{override} användas?
\item[] Det krävs \code{override} om du vill ge en ärvd medlem en \emph{annan} implementation i subtypen, om denna medlemmen redan \emph{har} en implementation i supertypen. Din nya implementation överskuggar (ersätter) den ärvda medlemmens implementation.
\item Vad är fördelen resp. nackdelen med att använda \code{override} även när det inte är nödvändigt?
\item[] \emph{Fördel:} du får hjälp av kompilatorn att kontrollera att du verkligen implementerar en ärvd medlem och inte t.ex. råkat stava medlemmens namn fel.
\item[] \emph{Nackdel:} mer att skriva och därmed även längre att läsa.
\end{itemize}

\SubtaskSolved
\begin{CodeSmall}
case class Dim(x: Int, y: Int) extends Pair[Int]
Expand Down

0 comments on commit 73c4496

Please sign in to comment.