Cambo Freelance
ទំព័រដើមសេវាកម្មអត្ថបទការបង្រៀនក្រុមវគ្គបណ្តុះបណ្តាលទំនាក់ទំនង
Cambo Freelance

Professional freelance team from Cambodia delivering technology-driven solutions with cultural insight and modern expertise.

ផ្ញើសាររបស់អ្នក

ត្រៀមចាប់ផ្តើមគម្រោងរបស់អ្នក? ទំនាក់ទំនងក្រុមរបស់យើង។

ទំនាក់ទំនង

សេវាកម្ម

  • Web & Mobile Development Services
  • Graphic Design & Branding Services

តំណភ្ជាប់មានប្រយោជន៍

  • ទំព័រដើម
  • សេវាកម្ម
  • ការសិក្សា
  • អំពីយើង
  • ទំនាក់ទំនង
  • តម្លៃ

© 2026 Cambo Freelance. រក្សាសិទ្ធិទាំងអស់។

TelegramFacebookLinkedInEmail
HomeTutorialsDartMethod Overriding in Dart
🎯Dart Tutorials

97 lessons

Beginner(35)0Complete Dart Tutorial Series — Course Index1Introduction to Dart2Installing Dart SDK3Setting Up VS Code for Dart4DartPad Online Editor5Hello World in Dart6Dart Syntax7Comments in Dart8Variables in Dart9Data Types in Dart10Strings in Dart11Numbers in Dart12Booleans in Dart13Type Conversion in Dart14Constants in Dart: final and const15User Input in Dart16Arithmetic Operators in Dart17Assignment Operators in Dart18Comparison Operators in Dart19Logical Operators in Dart20Null-Aware Operators in Dart21If Statement in Dart22If Else in Dart23Else If in Dart25Switch Statement in Dart26Ternary Operator in Dart27For Loop in Dart28While Loop in Dart29Do While Loop in Dart30Break and Continue in Dart32Nested Loops in Dart33Functions in Dart35Optional Parameters in Dart37Arrow Functions in Dart38Recursive Functions in Dart
Intermediate(34)39Lists in Dart40Sets in Dart41Maps in Dart42Collection Operations in Dart
Advanced(28)73Futures in Dart74Async and Await in Dart75Streams in Dart76
🎯

Dart Tutorials

Lesson 58 of 97

All lessons
Beginner (35)0Complete Dart Tutorial Series — Course Index1Introduction to Dart
43
Spread Operator and Collection Literals in Dart
44Collection If in Dart
45Collection For in Dart
46Null Safety in Dart
47Nullable Variables in Dart
48Null Assertion Operator in Dart
49Late Keyword in Dart
50Required Keyword in Dart
51Classes and Objects in Dart
52Constructors in Dart
53Getters and Setters in Dart
54Static Members in Dart
55Interfaces in Dart
56Polymorphism in Dart
57Inheritance in Dart
58Method Overriding in Dart
59Abstract Classes in Dart
60Abstract Classes vs Interfaces in Dart
61Mixins in Dart
62Extension Methods in Dart
63Exception Handling in Dart
64Try-Catch in Dart
65Finally Block in Dart
66Custom Exceptions in Dart
67Generics in Dart
68Typedef in Dart
69Enums in Dart
70Records in Dart
71Pattern Matching in Dart
72Cascade Notation in Dart
Stream Controllers in Dart
77Isolates in Dart
78File Operations in Dart
80JSON Parsing in Dart
82HTTP Requests in Dart
83REST API Client in Dart
84Dart Packages and pub.dev
85Testing in Dart
86Dart CLI Applications
87Dart Code Style and Best Practices
88Server-side Dart with Shelf
89Introduction to Flutter
90Flutter Widgets and Layouts
91Flutter State Management
92Flutter Navigation and Routing
93Project: Calculator in Dart
94Project: Temperature Converter in Dart
95Project: Age Calculator in Dart
96Project: Todo CLI App in Dart
97Project: Student Management System in Dart
98Project: Expense Tracker in Dart
100Project: Banking System in Dart
101Project: Inventory Management System in Dart
102Project: Contact Manager in Dart
103Project: Mini REST API Backend in Dart
2
Installing Dart SDK
3Setting Up VS Code for Dart
4DartPad Online Editor
5Hello World in Dart
6Dart Syntax
7Comments in Dart
8Variables in Dart
9Data Types in Dart
10Strings in Dart
11Numbers in Dart
12Booleans in Dart
13Type Conversion in Dart
14Constants in Dart: final and const
15User Input in Dart
16Arithmetic Operators in Dart
17Assignment Operators in Dart
18Comparison Operators in Dart
19Logical Operators in Dart
20Null-Aware Operators in Dart
21If Statement in Dart
22If Else in Dart
23Else If in Dart
25Switch Statement in Dart
26Ternary Operator in Dart
27For Loop in Dart
28While Loop in Dart
29Do While Loop in Dart
30Break and Continue in Dart
32Nested Loops in Dart
33Functions in Dart
35Optional Parameters in Dart
37Arrow Functions in Dart
38Recursive Functions in Dart
Intermediate (34)39Lists in Dart40Sets in Dart41Maps in Dart42Collection Operations in Dart43Spread Operator and Collection Literals in Dart44Collection If in Dart45Collection For in Dart46Null Safety in Dart47Nullable Variables in Dart48Null Assertion Operator in Dart49Late Keyword in Dart50Required Keyword in Dart51Classes and Objects in Dart52Constructors in Dart53Getters and Setters in Dart54Static Members in Dart55Interfaces in Dart56Polymorphism in Dart57Inheritance in Dart58Method Overriding in Dart59Abstract Classes in Dart60Abstract Classes vs Interfaces in Dart61Mixins in Dart62Extension Methods in Dart63Exception Handling in Dart64Try-Catch in Dart65Finally Block in Dart66Custom Exceptions in Dart67Generics in Dart68Typedef in Dart69Enums in Dart70Records in Dart71Pattern Matching in Dart72Cascade Notation in Dart
Advanced (28)73Futures in Dart74Async and Await in Dart75Streams in Dart76Stream Controllers in Dart77Isolates in Dart78File Operations in Dart80JSON Parsing in Dart82HTTP Requests in Dart83REST API Client in Dart84Dart Packages and pub.dev85Testing in Dart86Dart CLI Applications87Dart Code Style and Best Practices88Server-side Dart with Shelf89Introduction to Flutter90Flutter Widgets and Layouts91Flutter State Management92Flutter Navigation and Routing93Project: Calculator in Dart94Project: Temperature Converter in Dart95Project: Age Calculator in Dart96Project: Todo CLI App in Dart97Project: Student Management System in Dart98Project: Expense Tracker in Dart100Project: Banking System in Dart101Project: Inventory Management System in Dart102Project: Contact Manager in Dart103Project: Mini REST API Backend in Dart
🎯DartIntermediateLesson 58 of 97Dart TeamJune 19, 2026

Method Overriding in Dart

Master Dart method overriding — @override annotation, calling super, covariant keyword, overriding rules, and building polymorphic bonus calculators.


Table of Contents

  1. What is Method Overriding?
  2. @override Annotation
  3. Calling super
  4. Overriding Rules
  5. covariant Keyword
  6. Full Example
  7. Exercise
  8. Quiz
  9. Summary

What is Method Overriding?

Method overriding lets a subclass provide its own implementation of a method that is already defined in the parent class. The subclass version replaces the parent version for objects of that subclass type. This is the mechanism that makes runtime polymorphism work in Dart.

@override Annotation

The @override annotation tells the Dart compiler that you intentionally override a parent member. It is technically optional, but strongly recommended — the compiler will warn you if the method doesn't actually exist in the parent class:

class Vehicle {
  String make;
  Vehicle(this.make);

  String fuelType() => ''Petrol'';
  String describe() => ''$make runs on \$${fuelType()}'';
}

class ElectricCar extends Vehicle {
  int batteryCapacityKwh;
  ElectricCar(String make, this.batteryCapacityKwh) : super(make);

  @override
  String fuelType() => ''Electricity'';  // overrides parent

  @override
  String describe() =>
      ''$make is electric (\$${batteryCapacityKwh}kWh battery)'';
}

class HybridCar extends Vehicle {
  HybridCar(String make) : super(make);

  @override
  String fuelType() => ''Petrol + Electricity'';
  // describe() is NOT overridden — inherited from Vehicle
}

void main() {
  var vehicles = [
    Vehicle(''Toyota''),
    ElectricCar(''Tesla'', 100),
    HybridCar(''Prius''),
  ];

  for (var v in vehicles) {
    print(v.describe());
  }
}
Output:
Toyota runs on Petrol
Tesla is electric (100kWh battery)
Prius runs on Petrol + Electricity

Calling super

An overriding method can call the parent version using super.methodName(). This is useful for extending (not replacing) parent behavior:

class Logger {
  void log(String message) {
    print(''[LOG] $message'');
  }
}

class TimestampLogger extends Logger {
  @override
  void log(String message) {
    // Add timestamp, then call parent
    final timestamp = DateTime.now().toIso8601String();
    super.log(''[$timestamp] $message'');
  }
}

class PrefixLogger extends Logger {
  final String prefix;
  PrefixLogger(this.prefix);

  @override
  void log(String message) {
    super.log(''[$prefix] $message'');
  }
}

void main() {
  var tl = TimestampLogger();
  tl.log(''Server started'');
  // [LOG] [2024-01-15T10:30:00.000] Server started

  var pl = PrefixLogger(''AUTH'');
  pl.log(''User logged in'');
  // [LOG] [AUTH] User logged in
}

Overriding Rules

  • Return type: The overriding method can return a subtype of the parent return type (covariant return)
  • Parameters: Must match the parent signature (same name, count, and types)
  • Visibility: Cannot reduce visibility (cannot make a public method private)
  • final methods: Cannot be overridden — Dart does not have final for methods, but you can document intent
class Animal {
  Animal create() => Animal();
}

class Dog extends Animal {
  // Covariant return: Dog is a subtype of Animal — allowed
  @override
  Dog create() => Dog();
}

covariant Keyword

Normally, overriding parameter types must be the same or broader (contravariant). The covariant keyword allows a narrower type — useful for type-safe collections:

class Animal {
  void eat(covariant Animal food) {
    print(''$runtimeType eats \$${food.runtimeType}'');
  }
}

class Dog extends Animal {
  @override
  void eat(Dog food) {  // narrowed to Dog — allowed via covariant
    print(''Dog eats dog food'');
  }
}

Full Example: Employee Bonus System

class Employee {
  final String name;
  final double baseSalary;

  Employee(this.name, this.baseSalary);

  double calculateBonus() => baseSalary * 0.10;

  void printPayslip() {
    final bonus = calculateBonus();
    print(''--- Payslip for $name ---'');
    print(''Base Salary: \$\$${baseSalary.toStringAsFixed(2)}'');
    print(''Bonus:       \$\$${bonus.toStringAsFixed(2)}'');
    print(''Total:       \$\$${(baseSalary + bonus).toStringAsFixed(2)}'');
  }
}

class Manager extends Employee {
  final int teamSize;
  Manager(String name, double salary, this.teamSize) : super(name, salary);

  @override
  double calculateBonus() => super.calculateBonus() + teamSize * 500;
}

class SalesRep extends Employee {
  final double salesRevenue;
  SalesRep(String name, double salary, this.salesRevenue) : super(name, salary);

  @override
  double calculateBonus() => salesRevenue * 0.05;
}

class Intern extends Employee {
  Intern(String name, double salary) : super(name, salary);

  @override
  double calculateBonus() => 0;  // no bonus for interns
}

void main() {
  List<Employee> staff = [
    Employee(''Alice'', 60000),
    Manager(''Bob'', 90000, 8),
    SalesRep(''Carol'', 55000, 200000),
    Intern(''Dave'', 25000),
  ];

  for (var e in staff) {
    e.printPayslip();
    print('''');
  }
}
Output:
--- Payslip for Alice ---
Base Salary: $60000.00
Bonus:       $6000.00
Total:       $66000.00

--- Payslip for Bob ---
Base Salary: $90000.00
Bonus:       $13000.00
Total:       $103000.00

--- Payslip for Carol ---
Base Salary: $55000.00
Bonus:       $10000.00
Total:       $65000.00

--- Payslip for Dave ---
Base Salary: $25000.00
Bonus:       $0.00
Total:       $25000.00

Exercise

  1. Create an Animal class with a move() method. Override it in Fish (swims), Bird (flies), Snake (slithers). Store them in a List<Animal> and call move() on each.
  2. Create a logging hierarchy: BaseLogger with log(message), FileLogger that calls super and also writes to a list, NetworkLogger that calls super and adds an HTTP prefix.

Quiz

1. What does the @override annotation do?

  • A) Forces the method to be called at compile time
  • B) Signals intentional replacement of a parent method and enables compiler checking ✅
  • C) Prevents further overriding
  • D) Calls the parent method automatically

2. How do you call the parent''s version of an overridden method?

  • A) parent.method()
  • B) base.method()
  • C) super.method() ✅
  • D) this.super.method()

3. What does covariant allow in a method parameter?

  • A) A broader (parent) type
  • B) A narrower (subtype) — normally disallowed in overrides ✅
  • C) Any type
  • D) Only nullable types

Summary

Method overriding lets subclasses replace parent methods with customized implementations. Always use @override to signal intent and enable compiler checking. Call super.method() from an override when you want to extend (not replace) parent behavior. Overriding return types can be narrowed (covariant return), and the covariant keyword allows narrowing parameter types. Overriding is the runtime engine of polymorphism.

dartprogrammingintermediateoop
PreviousLesson 57: Inheritance in DartNextLesson 59: Abstract Classes in Dart
Back to All Tutorials