Sobes.tech
Junior

Czym są zasady programowania obiektowego?

sobes.tech AI

Odpowiedź od AI

Zasady OOP:

  • Enkapsulacja: Grupowanie danych (właściwości) i metod operujących na tych danych w jednym obiekcie oraz ukrywanie wewnętrznej implementacji przed światem zewnętrznym. Dostęp do danych odbywa się przez określone publiczne interfejsy (metody).

    // Ukrycie wewnętrznej implementacji właściwości balance
    class Account {
        private var balance: Double = 0.0
    
        func deposit(amount: Double) {
            if amount > 0 {
                balance += amount
            }
        }
    
        func getBalance() -> Double {
            return balance
        }
    }
    
  • Dziedziczenie: Mechanizm umożliwiający tworzenie nowej klasy (dziecko) na podstawie istniejącej (rodzic), dziedzicząc jej właściwości i metody. Sprzyja ponownemu użyciu kodu.

    // Klasy Dog i Cat dziedziczą właściwości i metody klasy Animal
    class Animal {
        let name: String
    
        init(name: String) {
            self.name = name
        }
    
        func makeSound() {
            print("\(name) wydaje dźwięk")
        }
    }
    
    class Dog: Animal {
        override func makeSound() {
            print("\(name) szczeka")
        }
    }
    
    class Cat: Animal {
        override func makeSound() {
            print("\(name) miauczy")
        }
    }
    
  • Polimorfizm: Zdolność obiektów różnych klas do reagowania na ten sam komunikat (wywołanie metody) w różny sposób, w zależności od ich typu.

    // Różne implementacje metody makeSound() w klasach Dog i Cat
    func playSound(of animal: Animal) {
        animal.makeSound() // Wywołanie polimorficzne
    }
    
    let myDog = Dog(name: "Bobby")
    let myCat = Cat(name: "Murka")
    
    playSound(of: myDog) // Wypisze "Bobby szczeka"
    playSound(of: myCat) // Wypisze "Murka miauczy"
    
  • Abstrakcja: Wyróżnianie istotnych cech obiektu i ignorowanie nieistotnych. Tworzenie uogólnionych reprezentacji obiektów.

    // Reprezentacja figury geometrycznej bez konkretnej implementacji
    protocol Shape {
        func calculateArea() -> Double
        func calculatePerimeter() -> Double
    }
    
    // Konkretne implementacje dla koła i kwadratu
    struct Circle: Shape {
        let radius: Double
    
        func calculateArea() -> Double {
            return Double.pi * radius * radius
        }
    
        func calculatePerimeter() -> Double {
            return 2 * Double.pi * radius
        }
    }
    
    struct Square: Shape {
        let side: Double
    
        func calculateArea() -> Double {
            return side * side
        }
    
        func calculatePerimeter() -> Double {
            return 4 * side
        }
    }