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! 🚀