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?