Sobes.tech
Junior

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.