Sobes.tech
Junior

Quali sono i principi della programmazione orientata agli oggetti?

sobes.tech AI

Risposta dell'AI

Principi di OOP:

  • Incapsulamento: Raggruppare dati (proprietà) e metodi che operano su questi dati in un unico oggetto e nascondere l'implementazione interna al mondo esterno. L'accesso ai dati avviene tramite interfacce pubbliche specifiche (metodi).

    // Nascondere l'implementazione interna della proprietà balance
    class Account {
        private var balance: Double = 0.0
    
        func deposit(amount: Double) {
            if amount > 0 {
                balance += amount
            }
        }
    
        func getBalance() -> Double {
            return balance
        }
    }
    
  • Ereditarietà: Meccanismo che permette di creare una nuova classe (figlia) basata su una esistente (genitore), ereditando le sue proprietà e metodi. Favorisce il riutilizzo del codice.

    // Le classi Dog e Cat ereditano le proprietà e i metodi della classe Animal
    class Animal {
        let name: String
    
        init(name: String) {
            self.name = name
        }
    
        func makeSound() {
            print("\(name) emette un suono")
        }
    }
    
    class Dog: Animal {
        override func makeSound() {
            print("\(name) abbaia")
        }
    }
    
    class Cat: Animal {
        override func makeSound() {
            print("\(name) miagola")
        }
    }
    
  • Polimorfismo: Capacità di oggetti di classi diverse di rispondere a un messaggio (chiamata di metodo) in modo diverso, a seconda del loro tipo.

    // Diverse implementazioni del metodo makeSound() nelle classi Dog e Cat
    func playSound(of animal: Animal) {
        animal.makeSound() // Chiamata polimorfica
    }
    
    let myDog = Dog(name: "Bobby")
    let myCat = Cat(name: "Murka")
    
    playSound(of: myDog) // Mostrerà "Bobby abbaia"
    playSound(of: myCat) // Mostrerà "Murka miagola"
    
  • Astrazione: Evidenziare le caratteristiche essenziali di un oggetto e ignorare quelle non essenziali. Creare rappresentazioni generali di oggetti.

    // Rappresentazione di una figura geometrica senza implementazione concreta
    protocol Shape {
        func calculateArea() -> Double
        func calculatePerimeter() -> Double
    }
    
    // Implementazioni concrete per cerchio e quadrato
    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
        }
    }