Klasser

Classes är som arkitektritningar för att bygga awesome saker i kod! Tänk er som digitala IKEA-instruktioner, fast mycket cooloare och ingen har tappat bort skruvarna! 📐

🎯 Efter denna artikel kommer du att:

  • Förstå Class vs Object skillnaden - ritning vs det faktiska huset 🏠
  • Skapa dina första classes - properties, methods, constructors 🔨
  • Använda classes praktiskt - verkliga scenario som gamer, student, etc 🎮
  • Förstå OOP grunder - encapsulation, abstraction och varför det rocks! 🚀

🏗️ Dina Första Classes - Bygg Digitala Saker

Basic Class Structure


public class Gamer
{
    // Properties (egenskaper) - vad en gamer HAR
    public string Name { get; set; }
    public int Level { get; set; }
    public int Experience { get; set; }
    public List<string> Games { get; set; }

    // Constructor - hur vi skapar en ny gamer
    public Gamer(string name)
    {
        Name = name;
        Level = 1;
        Experience = 0;
        Games = new List<string>();
    }

    // Methods (metoder) - vad en gamer kan GÖRA
    public void PlayGame(string gameName)
    {
        Console.WriteLine($"{Name} spelar {gameName}!");
        Experience += 10;

        if (!Games.Contains(gameName))
        {
            Games.Add(gameName);
        }

        CheckLevelUp();
    }

    public void DisplayStats()
    {
        Console.WriteLine($"🎮 GAMER PROFILE 🎮");
        Console.WriteLine($"Namn: {Name}");
        Console.WriteLine($"Level: {Level}");
        Console.WriteLine($"Experience: {Experience} XP");
        Console.WriteLine($"Spel spelade: {Games.Count}");
        Console.WriteLine($"Spel: {string.Join(", ", Games)}");
    }

    private void CheckLevelUp()  // Private = bara klassen själv kan använda
    {
        int newLevel = (Experience / 100) + 1;
        if (newLevel > Level)
        {
            Level = newLevel;
            Console.WriteLine($"🎉 Level Up! {Name} är nu Level {Level}!");
        }
    }
}

Använda Classen


// Skapa objekt från class (instantiera)
Gamer marcus = new Gamer("Marcus");
Gamer anna = new Gamer("Anna");

// Använd objektens metoder
marcus.PlayGame("Elden Ring");
marcus.PlayGame("Baldur's Gate 3");
anna.PlayGame("Cyberpunk 2077");

// Visa stats
marcus.DisplayStats();
anna.DisplayStats();

🔧 Class Components Breakdown

Properties - Vad Objektet HAR


public class Smartphone
{
    // Auto-implemented properties (modern C-Sharp)
    public string Brand { get; set; }
    public string Model { get; set; }
    public int StorageGB { get; set; }
    public double Price { get; set; }

    // Read-only property
    public string FullName => $"{Brand} {Model}";

    // Property with validation
    private int _batteryPercent;
    public int BatteryPercent
    {
        get { return _batteryPercent; }
        set
        {
            if (value < 0) _batteryPercent = 0;
            else if (value > 100) _batteryPercent = 100;
            else _batteryPercent = value;
        }
    }
}

Methods - Vad Objektet kan GÖRA


public class BankAccount
{
    public string AccountNumber { get; set; }
    public decimal Balance { get; private set; }  // Bara class kan ändra balance
    public string Owner { get; set; }

    // Constructor
    public BankAccount(string owner, string accountNumber, decimal initialBalance = 0)
    {
        Owner = owner;
        AccountNumber = accountNumber;
        Balance = initialBalance;
    }

    // Public methods (kan anropas utifrån)
    public bool Deposit(decimal amount)
    {
        if (amount <= 0)
        {
            Console.WriteLine("❌ Amount must be positive!");
            return false;
        }

        Balance += amount;
        Console.WriteLine($"✅ Deposited {amount:C}. New balance: {Balance:C}");
        return true;
    }

    public bool Withdraw(decimal amount)
    {
        if (amount <= 0)
        {
            Console.WriteLine("❌ Amount must be positive!");
            return false;
        }

        if (amount > Balance)
        {
            Console.WriteLine("❌ Insufficient funds!");
            return false;
        }

        Balance -= amount;
        Console.WriteLine($"✅ Withdrew {amount:C}. New balance: {Balance:C}");
        return true;
    }

    // Private method (bara class använder internt)
    private void LogTransaction(string type, decimal amount)
    {
        Console.WriteLine($"[LOG] {DateTime.Now}: {type} {amount:C} for {Owner}");
    }
}

Constructors - Hur vi SKAPAR Objekt


public class Pizza
{
    public string Size { get; set; }
    public List<string> Toppings { get; set; }
    public decimal Price { get; set; }

    // Default constructor
    public Pizza()
    {
        Size = "Medium";
        Toppings = new List<string>();
        Price = 0;
    }

    // Constructor med parametrar
    public Pizza(string size)
    {
        Size = size;
        Toppings = new List<string>();
        Price = CalculateBasePrice(size);
    }

    // Constructor med alla parametrar
    public Pizza(string size, List<string> toppings)
    {
        Size = size;
        Toppings = toppings ?? new List<string>();
        Price = CalculateBasePrice(size) + (Toppings.Count * 2.5m);
    }

    private decimal CalculateBasePrice(string size)
    {
        return size.ToLower() switch
        {
            "small" => 8.99m,
            "medium" => 12.99m,
            "large" => 16.99m,
            _ => 12.99m
        };
    }
}

// Användning av olika constructors
var plainPizza = new Pizza();                                    // Default
var mediumPizza = new Pizza("Medium");                          // Storlek
var deluxePizza = new Pizza("Large", new[] {"Pepperoni", "Mushrooms", "Olives"}.ToList()); // Allt

🏆 OOP Principles med Classes

🔒 Encapsulation - “Göm det komplicerade”


public class Car
{
    // Private internals - användaren behöver inte veta om dessa
    private bool _isEngineRunning = false;
    private int _fuelLevel = 100;
    private string _engineType = "V6";

    // Public interface - vad användaren får göra
    public void StartEngine()
    {
        if (_fuelLevel > 0)
        {
            _isEngineRunning = true;
            Console.WriteLine("🚗 Engine started!");
        }
        else
        {
            Console.WriteLine("⛽ Out of fuel!");
        }
    }

    public void Drive(int kilometers)
    {
        if (!_isEngineRunning)
        {
            Console.WriteLine("❌ Start the engine first!");
            return;
        }

        int fuelNeeded = kilometers / 10;  // 10km per fuel unit
        if (fuelNeeded <= _fuelLevel)
        {
            _fuelLevel -= fuelNeeded;
            Console.WriteLine($"🛣️ Drove {kilometers}km. Fuel left: {_fuelLevel}");
        }
        else
        {
            Console.WriteLine("⛽ Not enough fuel for this trip!");
        }
    }

    // Read-only status
    public string GetStatus()
    {
        return $"Engine: {(_isEngineRunning ? "Running" : "Off")}, Fuel: {_fuelLevel}%";
    }
}

// Usage - enkelt för användaren, komplext under huven
var myCar = new Car();
myCar.StartEngine();    // Användaren vet inte om _isEngineRunning
myCar.Drive(50);        // Användaren vet inte om _fuelLevel calculation

🎭 Abstraction - “Fokusera på det viktiga”


// Abstraction: Vi modellerar bara det vi behöver från verkligheten
public class CoffeeMachine
{
    // Vi bryr oss inte om: temperaturregleringar, pumptryck, elektronik
    // Vi fokuserar på: vad användaren vill göra

    public string CurrentDrink { get; private set; }
    public bool IsReady { get; private set; } = true;

    public void MakeCoffee(string type = "Espresso")
    {
        if (!IsReady)
        {
            Console.WriteLine("☕ Machine is busy, please wait...");
            return;
        }

        Console.WriteLine($"☕ Making {type}...");
        IsReady = false;

        // Simulate complex coffee making process
        Thread.Sleep(2000);  // 2 seconds

        CurrentDrink = type;
        IsReady = true;
        Console.WriteLine($"✅ Your {type} is ready!");
    }

    // Användaren behöver inte veta om alla kaffemaskinsdetaljer
    // De bara säger "gör kaffe" och det händer!
}

🎯 Checkpoint: Class Mastery

Kan du:

  • Förklara skillnaden mellan Class och Object
  • Skapa classes med properties, methods, och constructors
  • Använda access modifiers (public, private, protected)
  • Förstå encapsulation och abstraction
  • Identifiera God Classes och Anemic Classes
  • Skapa multiple objects från samma class

Test dig själv: Skapa en BankAccount class som kan deposita, withdrawa, och hålla koll på balance. Skapa flera konton och testa alla operationer.


💡 Marcus Class Wisdom

“Classes är som att designa Lego-bitar för din kod! Du skapar en gång, använder tusen gånger. Men kom ihåg - bra Lego-bitar är enkla och fokuserade, inte monster-bitar som kan göra allt!” 🧱

Real story: Första gången jag förstod classes (2001) byggde jag en “SuperClass” som kunde göra ALLT - spela musik, rendera grafik, hantera nätverk… 2000 rader kod! Det var som att bygga en Lego-bit stor som ett helt hus. Lärdom: one responsibility per class! 🏠

Pro tip: Om du inte kan förklara vad din class gör i EN MENING - den gör förmodligen för mycket. “This class represents a student” ✅ vs “This class handles students and teachers and courses and grades and…” ❌

Ready för inheritance och polymorphism? Classes är just början på OOP-magin! 🚀


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.