Les classes abstractes són un concepte fonamental en la programació orientada a objectes (OOP) que permeten definir una estructura base per a altres classes. En Dart, les classes abstractes es declaren amb la paraula clau abstract i no es poden instanciar directament. Aquestes classes poden contenir mètodes abstractes (sense implementació) que han de ser implementats per les subclasses, així com mètodes concrets (amb implementació).

Conceptes Clau

  1. Declaració de Classes Abstractes:

    • Utilitza la paraula clau abstract per declarar una classe abstracta.
    • Les classes abstractes no es poden instanciar directament.
  2. Mètodes Abstractes:

    • Són mètodes que no tenen implementació a la classe abstracta.
    • Les subclasses han d'implementar aquests mètodes.
  3. Mètodes Concrets:

    • Són mètodes que tenen una implementació a la classe abstracta.
    • Les subclasses poden utilitzar aquests mètodes tal com estan o sobreescriure'ls.

Exemple Pràctic

Declaració d'una Classe Abstracta

abstract class Animal {
  // Mètode abstracte
  void makeSound();

  // Mètode concret
  void sleep() {
    print('Sleeping...');
  }
}

Implementació d'una Subclasse

class Dog extends Animal {
  // Implementació del mètode abstracte
  @override
  void makeSound() {
    print('Bark!');
  }
}

class Cat extends Animal {
  // Implementació del mètode abstracte
  @override
  void makeSound() {
    print('Meow!');
  }
}

Utilització de les Subclasses

void main() {
  Dog dog = Dog();
  dog.makeSound(); // Output: Bark!
  dog.sleep();     // Output: Sleeping...

  Cat cat = Cat();
  cat.makeSound(); // Output: Meow!
  cat.sleep();     // Output: Sleeping...
}

Exercicis Pràctics

Exercici 1: Crear una Classe Abstracta

  1. Declara una classe abstracta anomenada Shape amb un mètode abstracte double area().
  2. Crea dues subclasses Circle i Rectangle que implementin el mètode area().
abstract class Shape {
  double area();
}

class Circle extends Shape {
  double radius;

  Circle(this.radius);

  @override
  double area() {
    return 3.14 * radius * radius;
  }
}

class Rectangle extends Shape {
  double width;
  double height;

  Rectangle(this.width, this.height);

  @override
  double area() {
    return width * height;
  }
}

void main() {
  Circle circle = Circle(5);
  print('Area of Circle: ${circle.area()}'); // Output: Area of Circle: 78.5

  Rectangle rectangle = Rectangle(4, 5);
  print('Area of Rectangle: ${rectangle.area()}'); // Output: Area of Rectangle: 20
}

Exercici 2: Afegir Mètodes Concrets

  1. Afegeix un mètode concret void describe() a la classe Shape que imprimeixi un missatge genèric.
  2. Sobreescriu el mètode describe() a les subclasses per proporcionar una descripció específica.
abstract class Shape {
  double area();

  void describe() {
    print('This is a shape.');
  }
}

class Circle extends Shape {
  double radius;

  Circle(this.radius);

  @override
  double area() {
    return 3.14 * radius * radius;
  }

  @override
  void describe() {
    print('This is a circle with radius $radius.');
  }
}

class Rectangle extends Shape {
  double width;
  double height;

  Rectangle(this.width, this.height);

  @override
  double area() {
    return width * height;
  }

  @override
  void describe() {
    print('This is a rectangle with width $width and height $height.');
  }
}

void main() {
  Circle circle = Circle(5);
  circle.describe(); // Output: This is a circle with radius 5.
  print('Area of Circle: ${circle.area()}'); // Output: Area of Circle: 78.5

  Rectangle rectangle = Rectangle(4, 5);
  rectangle.describe(); // Output: This is a rectangle with width 4 and height 5.
  print('Area of Rectangle: ${rectangle.area()}'); // Output: Area of Rectangle: 20
}

Errors Comuns i Consells

  1. No Implementar Mètodes Abstractes:

    • Si una subclasse no implementa tots els mètodes abstractes de la seva classe base, es produirà un error de compilació.
    • Consell: Assegura't d'implementar tots els mètodes abstractes a les subclasses.
  2. Intentar Instanciar una Classe Abstracta:

    • Intentar crear una instància d'una classe abstracta produirà un error.
    • Consell: Utilitza subclasses concretes per crear instàncies.

Resum

En aquesta secció, hem après sobre les classes abstractes en Dart, incloent com declarar-les, com definir mètodes abstractes i concrets, i com implementar subclasses que hereten d'aquestes classes abstractes. També hem vist exemples pràctics i exercicis per reforçar els conceptes apresos. Les classes abstractes són una eina poderosa per crear jerarquies de classes ben estructurades i reutilitzables.

© Copyright 2024. Tots els drets reservats