Polymorphism Using Abstract Classes in Object Oriented Programming in Dart

void main() {
    var animals = [];
    animals.add(new Dog("Dog 1"));
    animals.add(new Cat("Cat 1"));
    animals.add(new Cat("Cat 2"));
    animals.add(new Dog("Dog 2"));
    for (Animal animal in animals) {
      animal.sound();
      print("==============================");
    }
}
  
abstract class Animal {
    
    late String name;
  
    Animal() {}
  
    Animal.fromName(String name) {
      this.name = name;
    }
  
    void sound();
}
  
class Cat extends Animal {

    Cat(String name) : super.fromName(name) {}
  
    void sound() {
      print(this.name + " sound: Meo Meo");
    }
}
  
class Dog extends Animal {

    Dog(String name) : super.fromName(name) {}
  
    void sound() {
      print(this.name + " sound: Gau Gau");
    }
}    
  
Dog 1 sound: Gau Gau
==============================
Cat 1 sound: Meo Meo
==============================
Cat 2 sound: Meo Meo
==============================
Dog 2 sound: Gau Gau
==============================