Objektorienterad programmering (OOP)

💡 Vad är OOP?

OOP är som att bygga med LEGO! 🧱

Tänk dig att du ska bygga en hel stad. Istället för att ha en jättestor klump av kod, delar du upp allt i små, smarta objekt:

  • 🚗 Bil-objekt - kan accelerera, bromsa, tuta
  • 🏠 Hus-objekt - har adress, ägare, färg
  • 👤 Person-objekt - har namn, ålder, kan gå, prata

Varje objekt vet vad det ska göra och har sina egna superkrafter (metoder) och egenskaper (properties)!

🎯 TL;DR

OOP = bygga program som LEGO. Skapa objekt (klasser) med egenskaper och beteenden. Enkelt att återanvända, ändra och förstå. Fyra grundpelare: Inkapsling, Arv, Polymorfism, Abstraktion.

📋 Efter att ha läst detta kommer du att kunna

  • Förstå vad OOP är och varför det är så användbart 🧠
  • Skapa klasser och objekt i C-Sharp 🏗️
  • Använda de fyra grundpelarna i OOP ⚡
  • Se skillnaden mellan objekt och klasser 👀
  • Bygga enkla men kraftfulla program med OOP 🚀

🔧 De fyra grundpelarna i OOP

🏰 1. Inkapsling (Encapsulation)

“Håll privata saker privata”

Tänk på ditt bankkonto - du kan se saldot och sätta in pengar, men banken låter dig INTE direkt ändra saldot genom att skriva in ett nytt nummer!


public class BankKonto
{
    private decimal saldo; // 🔒 Privat - ingen kan ändra direkt!

    public decimal GetSaldo() // 👀 Kan bara KOLLA saldot
    {
        return saldo;
    }

    public void SättaIn(decimal summa) // ✅ Säker metod att ändra saldot
    {
        if (summa > 0)
            saldo += summa;
    }
}

🧬 2. Arv (Inheritance)

“Ärv superkrafter från föräldrar”

Precis som du ärvt egenskaper från dina föräldrar, kan klasser ärva från andra klasser:


// 🐾 Basdjur
public class Animal
{
    public string Name { get; set; }
    public void Eat() => Console.WriteLine($"{Name} äter");
}

// 🐕 Hund ärver från Animal
public class Dog : Animal
{
    public void Bark() => Console.WriteLine($"{Name} skäller: Woof!");
}

// 🐱 Katt ärver från Animal
public class Cat : Animal
{
    public void Meow() => Console.WriteLine($"{Name} jamar: Mjau!");
}

🎭 3. Polymorfism (Polymorphism)

“Samma sak, olika sätt”

Alla djur kan göra ljud, men på olika sätt:


public abstract class Animal
{
    public abstract void MakeSound(); // Alla måste implementera detta!
}

public class Dog : Animal
{
    public override void MakeSound() => Console.WriteLine("Woof!");
}

public class Cat : Animal
{
    public override void MakeSound() => Console.WriteLine("Mjau!");
}

// 🎪 Magi - samma metod, olika beteende!
List<Animal> djur = new List<Animal> { new Dog(), new Cat() };
foreach(Animal djuret in djur)
{
    djuret.MakeSound(); // Dog säger Woof, Cat säger Mjau!
}

🎨 4. Abstraktion (Abstraction)

“Visa bara det viktiga”

När du kör bil behöver du inte veta hur motorn fungerar - du trycker bara på gasen!


public abstract class Vehicle
{
    public abstract void StartEngine(); // Vad som ska hända
    public abstract void Drive();       // men inte HOW det händer
}

public class Car : Vehicle
{
    public override void StartEngine() => Console.WriteLine("🚗 Bilmotor startar");
    public override void Drive() => Console.WriteLine("🛣️ Kör på vägen");
}

✨ Fördelar med OOP

🧩 Modularitet

Som LEGO-klossar!


// Varje klass är som en LEGO-kloss
public class Player { } // 🎮 Spelare
public class Enemy { }  // 👾 Fiende
public class Weapon { } // ⚔️ Vapen
// Enkelt att kombinera på olika sätt!

🔄 Återanvändbarhet

Skriv en gång, använd överallt!


// Samma Person-klass kan användas i:
// - Skol-system (Student extends Person)
// - Sjukhus-system (Patient extends Person)
// - HR-system (Employee extends Person)
public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

🛠️ Lätt att underhålla

Ändra en sak utan att förstöra allt annat!


// Om du ändrar hur Car fungerar...
public class Car
{
    private void ImprovedEngine() // 🔧 Ny förbättring!
    {
        // ...bara Car påverkas, inte hela programmet!
    }
}

🎯 Abstraktion

Fokusera på VHAT, inte HOW


// Du behöver inte veta HOW SendEmail fungerar
EmailService.SendEmail("test@test.com", "Hej!");
// Du bara använder det! 🚀

⚠️ När OOP kan bli krångligt

🧗 Inlärningskurva

Många nya begrepp att lära sig

  • Klasser, objekt, arv, polymorfism…
  • Lösning: Ta en sak i taget! Börja med enkla klasser.

🐌 Prestanda

Ibland lite långsammare

  • Extra “lager” kan göra kod långsammare
  • Lösning: Oftast märker du inte skillnaden! Bara viktigt i extrema fall.

🕸️ Överkomplexitet

Risk att göra enkla saker komplicerade


// 🚨 ÖVERKILL för enkel räknare
public abstract class AbstractCalculatorFactoryBuilder
{
    // 50 rader kod för att addera 2+2...
}

// ✅ ENKELT är bättre
public class Calculator
{
    public int Add(int a, int b) => a + b; // 🎯 Klart!
}

🎮 Användningsområden för OOP

🏢 Applikationsutveckling


// Bankssystem med objekt
public class Account { }
public class Customer { }
public class Transaction { }
// Tydlig struktur! 💼

🎯 Spelutveckling


public class Player { }
public class Enemy { }
public class PowerUp { }
public class GameLevel { }
// Perfekt för spel! 🕹️

🌐 Webbutveckling


public class User { }
public class BlogPost { }
public class Comment { }
// MVC-mönster använder OOP! 🌎

🔬 Simuleringar


public class Particle { }
public class ForceField { }
public class PhysicsEngine { }
// Modellera verkligheten! ⚗️

🗄️ Databashantering


// Entity Framework använder OOP
public class Product { }
public class Order { }
public class Customer { }
// Databas + Objekt = ❤️

🚀 OOP i praktiken - Bil-exempel

🟢 Grundläggande klass


// 🚗 Bil-klass med inkapsling
public class Car
{
    // 🔒 Privata fält (inkapsling)
    private string brand;
    private string color;
    private int speed;

    // 🏗️ Konstruktor (bygger objektet)
    public Car(string brand, string color)
    {
        this.brand = brand;
        this.color = color;
        this.speed = 0; // Börjar stillastående
    }

    // ⚡ Metoder (vad bilen kan göra)
    public void Accelerate(int value)
    {
        speed += value;
        Console.WriteLine($"🏎️ Accelererar till {speed} km/h");
    }

    public void Brake(int value)
    {
        speed = Math.Max(0, speed - value); // Kan inte ha negativ hastighet
        Console.WriteLine($"🛑 Bromsar till {speed} km/h");
    }

    // 👀 Getter (säkert sätt att se hastighet)
    public int GetSpeed() => speed;

    public void StartEngine()
    {
        Console.WriteLine($"🔥 {brand} startar motorn!");
    }
}

🟡 Använda klassen


public class Program
{
    public static void Main()
    {
        // 🏗️ Skapa ett bil-objekt
        Car minBil = new Car("Volvo", "röd");

        // 🎮 Använd bilens metoder
        minBil.StartEngine();      // 🔥 Volvo startar motorn!
        minBil.Accelerate(50);     // 🏎️ Accelererar till 50 km/h
        minBil.Accelerate(30);     // 🏎️ Accelererar till 80 km/h
        minBil.Brake(20);          // 🛑 Bromsar till 60 km/h

        Console.WriteLine($"Slutlig hastighet: {minBil.GetSpeed()} km/h");
    }
}

🔴 Utvidgat med arv


// 🏎️ Racerbil ärver från Car
public class RaceCar : Car
{
    private bool turboMode;

    public RaceCar(string brand, string color) : base(brand, color)
    {
        turboMode = false;
    }

    public void ActivateTurbo()
    {
        turboMode = true;
        Console.WriteLine("🚀 TURBO AKTIVERAT!");
        Accelerate(100); // Extra snabb acceleration!
    }
}

// 🚌 Buss ärver också från Car
public class Bus : Car
{
    private int passengers;

    public Bus(string brand, string color) : base(brand, color)
    {
        passengers = 0;
    }

    public void PickUpPassengers(int count)
    {
        passengers += count;
        Console.WriteLine($"🚌 {count} passagerare klev på. Totalt: {passengers}");
    }
}

🎓 Begrepp att komma ihåg

BegreppFörklaringExempel
KlassRitning/mall för objektclass Car
ObjektInstans av en klassnew Car()
InkapslingHålla data privatprivate int speed
ArvÄrva från annan klassclass RaceCar : Car
PolymorfismSamma metod, olika beteendeoverride MakeSound()
AbstraktionFörenkla komplexitetabstract class Vehicle

📚 Sammanfattning

OOP = smart sätt att organisera kod:

  • 🧱 Klasser - Ritningar för objekt
  • 🏗️ Objekt - Instanser av klasser
  • 🔒 Inkapsling - Skydda data
  • 🧬 Arv - Återanvänd och utöka kod
  • 🎭 Polymorfism - Flexibel kod
  • 🎨 Abstraktion - Förenkla komplexitet

🎯 Övningar

  1. 🟢 Grundläggande: Skapa en Person-klass med namn och ålder
  2. 🟡 Utmanande: Skapa Student och Teacher som ärver från Person
  3. 🔴 Expert: Bygg ett enkelt djurpark-system med polymorfism

😄 Obligatorisk dad joke

Varför gillar programmerare OOP?

För att de älskar att ha klass! 🎩📚


Undersidor


    Upp

    Upp


    Licens: Apache 2.0 | © 2023 Marcus Medina, Campus Mölndal. Alla rättigheter förbehållna.
    Du får använda och modifiera detta verk enligt villkoren i Apache License, Version 2.0. Du får inte använda detta verk för kommersiella ändamål utan tillstånd från upphovsmannen.