๐ŸŽ“ A1Learner
๐Ÿ”
0 of 40 lessons completed

Dart Inheritance

Inheritance lets a class build on another class. The new class gains the fields and the methods of the class it extends.

Inheriting a field and a method

A subclass is a class that extends another class, and that other class is its superclass. Cat gains the name field and the speak method from Animal.

class Animal {
  String name;
  Animal(this.name);
  void speak() {
    print('$name makes a sound');
  }
}

class Cat extends Animal {
  Cat(String name) : super(name);
}

void main() {
  var cat = Cat('Milo');
  print(cat.name);
  cat.speak();
}

Overriding a method

@override marks a method that replaces the superclass version. speak now prints a barking line for a dog.

class Animal {
  String name;
  Animal(this.name);
  void speak() {
    print('$name makes a sound');
  }
}

class Dog extends Animal {
  Dog(String name) : super(name);
  @override
  void speak() {
    print('$name barks');
  }
}

void main() {
  var dog = Dog('Rex');
  print(dog.name);
  dog.speak();
}

A method only the subclass has

A subclass can add methods that the superclass does not have. fetch exists only on Dog, and speak still comes from Animal.

class Animal {
  String name;
  Animal(this.name);
  void speak() {
    print('$name makes a sound');
  }
}

class Dog extends Animal {
  Dog(String name) : super(name);
  void fetch() {
    print('$name fetches the ball');
  }
}

void main() {
  var dog = Dog('Rex');
  dog.speak();
  dog.fetch();
}

A subclass field beside super

The subclass constructor holds an extra field in this program. super(name) passes the name up to Animal, and this.age keeps the age on Dog.

class Animal {
  String name;
  Animal(this.name);
  void speak() {
    print('$name makes a sound');
  }
}

class Dog extends Animal {
  int age;
  Dog(String name, this.age) : super(name);
  @override
  void speak() {
    print('$name barks');
  }
}

void main() {
  var dog = Dog('Rex', 4);
  print(dog.name);
  print(dog.age);
  dog.speak();
}

Example

class Animal {
  String name;
  Animal(this.name);
  void speak() {
    print('$name makes a sound');
  }
}

class Dog extends Animal {
  Dog(String name) : super(name);
  @override
  void speak() {
    print('$name barks');
  }

  void fetch() {
    print('$name fetches the ball');
  }
}

class Cat extends Animal {
  Cat(String name) : super(name);
  @override
  void speak() {
    print('$name meows');
  }
}

void main() {
  var dog = Dog('Rex');
  var cat = Cat('Milo');
  dog.speak();
  dog.fetch();
  cat.speak();
}

Key points

  • Use extends after the subclass name to inherit from a superclass.
  • Use @override above a method that replaces a superclass method.
  • A subclass constructor passes values up with super in its initializer list.
  • A subclass can add new methods of its own.
  • An inherited method runs unchanged when a subclass does not override it.

In this example, Animal holds the name field and a speak method. Dog extends Animal, passes its name up with super, and overrides speak with a barking line. Dog also adds a fetch method of its own. Cat extends Animal and overrides speak with a meowing line, so each animal prints its own sound.

Try it Yourself

Edit the code, then press Run.

Running is simulated ยท DartPad

Exercise

Which keyword lets a class inherit from another class?