Sobes.tech
Junior

Quais são os princípios da Programação Orientada a Objetos?

sobes.tech IA

Resposta da IA

Princípios de POO:

  • Encapsulamento: Agrupamento de dados (propriedades) e métodos que operam com esses dados num único objeto e ocultando a implementação interna do mundo exterior. O acesso aos dados é feito através de interfaces públicas específicas (métodos).

    // Ocultação da implementação interna da propriedade balance
    class Account {
        private var balance: Double = 0.0
    
        func deposit(amount: Double) {
            if amount > 0 {
                balance += amount
            }
        }
    
        func getBalance() -> Double {
            return balance
        }
    }
    
  • Herança: Mecanismo que permite criar uma nova classe (filha) baseada numa existente (pai), herdando as suas propriedades e métodos. Isto favorece a reutilização de código.

    // As classes Dog e Cat herdam as propriedades e métodos da classe Animal
    class Animal {
        let name: String
    
        init(name: String) {
            self.name = name
        }
    
        func makeSound() {
            print("\(name) emite um som")
        }
    }
    
    class Dog: Animal {
        override func makeSound() {
            print("\(name) late")
        }
    }
    
    class Cat: Animal {
        override func makeSound() {
            print("\(name) mia")
        }
    }
    
  • Polimorfismo: Capacidade de objetos de diferentes classes responderem a uma mesma mensagem (chamada de método) de forma distinta, dependendo do seu tipo.

    // Diferentes implementações do método makeSound() nas classes Dog e Cat
    func playSound(of animal: Animal) {
        animal.makeSound() // Chamada polimórfica
    }
    
    let myDog = Dog(name: "Bobby")
    let myCat = Cat(name: "Murka")
    
    playSound(of: myDog) // Mostrará "Bobby late"
    playSound(of: myCat) // Mostrará "Murka mia"
    
  • Abstração: Destacar as características essenciais de um objeto e ignorar as não essenciais. Criar representações gerais de objetos.

    // Representação de uma figura geométrica sem implementação concreta
    protocol Shape {
        func calculateArea() -> Double
        func calculatePerimeter() -> Double
    }
    
    // Implementações concretas para círculo e quadrado
    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
        }
    }