Qual é a semelhança e a diferença entre uma classe normal e uma classe abstrata?
sobes.tech IA
Resposta da IA
No Golang, não existe o conceito de "classe normal" e "classe abstrata" na forma como existem em linguagens orientadas a objetos como Java ou C#.
No entanto, a sua funcionalidade pode ser imitada usando estruturas e interfaces.
Semelhanças (usando estruturas e interfaces em Golang):
- Estado (dados): A estrutura pode conter campos, como uma classe normal que armazena propriedades.
- Comportamento (métodos): Métodos podem ser anexados à estrutura, que definirão seu comportamento, semelhante aos métodos de uma classe normal.
- Contrato comum (para classe abstrata e interface): A interface em Golang define um conjunto de métodos que qualquer estrutura "que implemente" essa interface deve definir. Isso é semelhante a como uma classe abstrata ou interface em outras linguagens define um contrato para as classes que herdam ou implementam.
Diferenças (no contexto de Golang):
| Característica | "Classe normal" (estrutura com métodos) | "Classe abstrata" (interface + estruturas) |
|---|---|---|
| Criação direta | Pode criar uma instância da estrutura. | Não é possível criar uma instância da interface. |
| Implementação de métodos | Todos os métodos anexados à estrutura têm implementação. | A interface apenas declara métodos, mas não sua implementação. |
| Herança | Não há herança explícita no sentido clássico. Pode-se usar composição (inserção de estruturas). | A interface não herda, mas é implementada por estruturas. |
| Obrigatoriedade de implementação | Não há obrigatoriedade de implementar um conjunto específico de métodos, além daqueles anexados à estrutura. | Qualquer estrutura que "implemente" a interface Golang deve fornecer a implementação de todos os seus métodos. |
| Armazenamento de estado (campos) | A estrutura pode conter campos de dados. | A interface não contém campos de dados. |
Exemplo de imitação:
// interface que imita uma classe abstrata
type Shape interface {
Area() float64
Perimeter() float64
}
// estrutura que imita uma classe normal
type Circle struct {
Radius float64
}
// implementação dos métodos da interface para Circle
func (c Circle) Area() float64 {
return 3.14 * c.Radius * c.Radius
}
func (c Circle) Perimeter() float64 {
return 2 * 3.14 * c.Radius
}
// Outra estrutura que implementa a interface
type Rectangle struct {
Width, Height float64
}
func (r Rectangle) Area() float64 {
return r.Width * r.Height
}
func (r Rectangle) Perimeter() float64 {
return 2 * (r.Width + r.Height)
}
Neste exemplo, Shape atua como um contrato (semelhante a uma classe abstrata ou interface em outras linguagens), e Circle e Rectangle são implementações concretas (análogos a classes normais). Podemos criar instâncias de Circle e Rectangle, mas não podemos criar uma instância de Shape diretamente. Além disso, ambas as estruturas devem implementar os métodos Area() e Perimeter() para "cumprir" a interface Shape.