Metodspecialisering avser när en subklass tillhandahåller en mer
specifik implementation av en metod än sin superklass. Ponera
klasserna Egendom
och Hus
där Hus
ärver av Egendom
. Man
kan tänka sig att det finns en metod skatt()
för Egendom
som
beräknar en viss grundskatt baserat på något givet värde, men att
Hus
tillhandahåller en egen implementation av skatt()
som är
mer specifik för just hus, t.ex. gör vissa avdrag etc. som
gäller specifikt för hus. Man kan tänka sig att den mer specifika
skatt()
-metoden anropar den mer generella för återanvändning
(räkna ut grundskatten).
Polymorfism är möjligheten att behandla olika typer av värden
genom ett gemensamt gränssnitt eller möjligheten att applicera en
funktion på flera olika typer av värden. Det finns många olika
typer av polymorfism – studera detta begrepp vidare! I Haskell
stötte ni på polymorfism till exempel i signaturen till map :: (a
-> b) -> [a] -> [b]
– map
tar en funktion från a
till b
ch en lista av a
:n och beräknar en lista av b
:n, och fungerar
likadant oavsett vilka typer man använder istället för a
och
b
.
Subtypspolymorfism avser polymorfism mellan subtyper, t.ex. Hus
och Egendom
ovan och husets möjlighet att uppträda/bli behandlat
som en generell form av egendom. (Javas dynamiska bindning gör här
att huset ändå bibehåller sitt specifika beteende.)
Inheritance facilitates (or even allows) the modularisation of
definitions, which can be very useful even if a class hierarchy
never branches out (meaning that no class has more than one
subclass). Imagine a class hierarchy with classes calculateTax()
” method calls the more general method for reuse,
e.g., to calculate basic tax.”
This allows us to distribute the specification of a behaviour over
multiple source locations in a way that may facilitate software
development and software evolution when used correctly. For
example, in the above example it is immediately clear from the
code that house taxation can be understood as a clean extension to
property taxation. This might be even more useful if Property
has several subclasses each subject to its own specific tax laws
as it allows reuse (because of the modular description) of the
basic property tax laws, making each delta small. In the case
where the variation in taxation is greater, we might implement
taxation as several methods working together, which allows a more
fine-grained overriding in subclasses. Be careful to not create
too unwieldy programs where the logic is hard to follow due to the
implicit (possibility of) branching in dynamic dispatch.
Overriding for its own sake shall be avoided.
If you find inheritance interesting, Tobias recommends a recent paper by Black, Bruce and Noble on the The Essence of Inheritance which he enjoyed immensely, especially Andrew’s presentation. Here is a(nother) recording of this presentation from WadlerFest.
Report a bug on this achievement? Please place an issue on GitHub.