Em programação, a herança e o polimorfismo são dois conceitos fundamentais de orientação a objetos. No Dart, esses conceitos são implementados de maneira muito eficaz e intuitiva. Vamos começar com a herança.
Herança
A herança é um mecanismo que permite que uma classe herde as propriedades e métodos de outra classe. A classe que herda é chamada de subclasse ou classe derivada, e a classe da qual ela herda é chamada de superclasse ou classe base.
Em Dart, a herança é implementada usando a palavra-chave 'extends'. Por exemplo, considere a seguinte classe base 'Animal':
class Animal { void eat() { print('Eating...'); } }
Podemos criar uma subclasse 'Dog' que herda de 'Animal' da seguinte maneira:
class Dog extends Animal { void bark() { print('Barking...'); } }
Agora, um objeto da classe 'Dog' pode acessar tanto o método 'eat()' da classe base 'Animal', quanto o método 'bark()' da própria classe:
var d = Dog(); d.eat(); // Output: Eating... d.bark(); // Output: Barking...
Isso é herança. A classe 'Dog' herda todas as propriedades e métodos da classe 'Animal' e também pode adicionar seus próprios métodos e propriedades.
Polimorfismo
O polimorfismo é um conceito que permite que um objeto seja tratado como uma instância de uma classe base, mesmo que seja realmente uma instância de uma subclasse. Isso é muito útil quando se deseja escrever código que pode lidar com objetos de várias classes diferentes, desde que todas essas classes sejam subclasses de uma certa classe base.
Em Dart, o polimorfismo é implementado através do uso de variáveis de tipo base para referenciar objetos de subclasse. Por exemplo, considere a seguinte classe base 'Shape' e duas subclasses 'Circle' e 'Square':
abstract class Shape { void draw(); } class Circle extends Shape { void draw() { print('Drawing a circle...'); } } class Square extends Shape { void draw() { print('Drawing a square...'); } }
Agora, podemos criar uma função que aceita um objeto de tipo 'Shape' e chama o método 'draw()' nele:
void drawShape(Shape shape) { shape.draw(); }
Podemos então passar um objeto 'Circle' ou 'Square' para esta função, e o método 'draw()' apropriado será chamado:
var c = Circle(); drawShape(c); // Output: Drawing a circle... var s = Square(); drawShape(s); // Output: Drawing a square...
Isso é polimorfismo. A função 'drawShape()' pode lidar com qualquer objeto que seja uma instância de 'Shape' ou qualquer uma de suas subclasses.
Em resumo, a herança e o polimorfismo são dois conceitos muito poderosos em programação orientada a objetos que permitem escrever código mais reutilizável e flexível. No Dart, esses conceitos são implementados de maneira muito intuitiva e fácil de usar, tornando o Dart uma excelente escolha para o desenvolvimento de aplicativos.