Programmering nivå 2

Kap 3.5 – Arv och polymorfism

Bygg vidare på klasser och låt samma metodnamn ge olika beteenden.

Mål med lektionen

När du har arbetat klart med denna lektion ska du:

  • Förstå vad arv innebär i objektorienterad programmering.
  • Kunna skapa en klass som ärver från en annan klass.
  • Förstå grunderna i polymorfism och hur metoder kan överskuggas, alltså override.

Så här lär du dig bäst

Titta på hur du kan bygga vidare på en redan existerande klass. Börja med ett enkelt exempel och försök sedan skriva en egen basklass och subklass. Kör koden och se hur objekten beter sig beroende på vilken klass de tillhör. Läs gärna vidare om super() när du vill fördjupa dig.

Centrala begrepp

  • Arv: en klass, subklassen, kan ärva attribut och metoder från en annan klass.
  • Superklass eller basklass: den ursprungliga klassen vars beteenden ärvs.
  • Subklass: en ny klass som bygger vidare på en annan.
  • Override: en metod i subklassen ersätter metoden i basklassen.
  • Polymorfism: samma metodnamn kan användas på olika objekt och ge olika resultat.

Arv i Python

Python använder parenteser för att visa att en klass ärver från en annan:

class Animal:
    def speak(self):
        print("Djuret låter.")

class Dog(Animal):
    def speak(self):
        print("Hunden säger voff.")

Användning:

animal = Animal()
dog = Dog()

animal.speak()  # Djuret låter.
dog.speak()     # Hunden säger voff.

Här ärver Dog från Animal, men metoden speak() har skrivits om i subklassen. Det kallas override.

Polymorfism i praktiken

animals = [Dog(), Animal()]

for animal in animals:
    animal.speak()

Alla objekt kan hanteras med samma metodanrop, men svarar på olika sätt beroende på vilken klass de tillhör.

Flera subklasser med polymorfism

class Cat(Animal):
    def speak(self):
        print("Katten säger mjau.")

class Bird(Animal):
    def speak(self):
        print("Fågeln kvittrar.")

animals = [Dog(), Cat(), Bird()]

for animal in animals:
    animal.speak()

Beräkningsexempel med olika former

class Shape:
    def area(self):
        return 0

class Rectangle(Shape):
    def __init__(self, w, h):
        self.w = w
        self.h = h

    def area(self):
        return self.w * self.h

class Circle(Shape):
    def __init__(self, r):
        self.r = r

    def area(self):
        return 3.14 * self.r ** 2

shapes = [Rectangle(4, 5), Circle(3)]

for shape in shapes:
    print("Area:", shape.area())

super(): utöka basklassens metod

class Person:
    def __init__(self, name):
        self.name = name

    def introduce(self):
        print(f"Jag heter {self.name}.")

class Student(Person):
    def __init__(self, name, school):
        super().__init__(name)
        self.school = school

    def introduce(self):
        super().introduce()
        print(f"Jag går på {self.school}.")

super() gör det möjligt att återanvända basklassens kod och sedan lägga till mer beteende i subklassen.

Öva: använd arv

  1. Skapa en basklass Vehicle med metoden drive().
  2. Skapa två subklasser: Car och Bike, som överskuggar drive().
  3. Skapa en lista med både bilar och cyklar och låt dem köra i en loop.
  4. Lägg till en metod i en subklass som använder super().

Sammanfattning

  • Arv låter en klass återanvända kod från en annan.
  • Subklasser kan ändra hur en metod fungerar.
  • Polymorfism låter samma metodanrop bete sig olika beroende på objekt.
  • super() kan användas för att återanvända logik från basklassen.

Tillbaka till Kapitel 3