Mixins in Dart : A Multiple Inheritance Alternative

Home » Dart » Mixins in Dart : A Multiple Inheritance Alternative

In this tutorial, we’ll explore a language feature that is uncommon in other programming languages. Let’s unfold the utilization of mixins in Dart.

Dart is an electrifying language that supports a wide variety of modern programming features. It incorporates multilevel inheritance, lambda functions, and generic classes, among others.

Mixins in Dart : A Multiple Inheritance Alternative

Understanding Mixins in Dart

Mixins provide a means to reuse a class’s code across multiple class hierarchies without requiring inheritance. They help in avoiding deep hierarchies. In Dart, a ‘mixin’ involves incorporating the properties and methods of one class into another.

Declaring a Mixin

To declare a mixin in Dart, use the ‘mixin‘ keyword followed by a valid identifier. A mixin class cannot have constructors, ensuring seamless integration into multiple class hierarchies.

mixin ServerLog {
  
  void logMessage(String message)
  {
    print('Log: $message ${DateTime.now()}');
  }

}

Here, we’ve defined a simple ServerLog that can be effortlessly integrated into other classes.

Applying a Mixin

Applying a mixin involves using the ‘with’ keyword followed by the mixin’s name in the class declaration. This action injects the functionality of the mixin into the class.

// using mixin
class Client with ServerLog{
   String clientBrowser;
   Client(this.clientBrowser);
   void displayMessage()
   {
    print("Client Browser: $clientBrowser");
    logMessage('$clientBrowser');
   }
}

Complete Program:


mixin ServerLog {
  
  void logMessage(String message)
  {
    print('Log: $message ${DateTime.now()}');
  }

}

// using mixin
class Client with ServerLog{
   String clientBrowser;
   Client(this.clientBrowser);
   void displayMessage()
   {
    print("Client Browser: $clientBrowser");
    logMessage('$clientBrowser');
   }
}

void main() {
  Client client = Client('Safari');
  client.displayMessage();
}

Client Browser: Safari
Log: Safari 2024-01-26 21:20:46.626817

Is it possible to combine mixins?

That is possible, Dart allows combining multiple mixins using the with keyword, enabling the integration of multiple functionalities into a single class.

Open DartPad and write the following program:

mixin Student{
  void info() => print("Showing student info..");
  
}
mixin Teacher{
  void message() => print('Teacher message is loading');
}

class School with Student, Teacher 
{
 School.details(){ // named constructor 
  message();
  info();
 }
}

void main() {
  School school = School.details();
}

Teacher message is loading
Showing student info..

Mixins serve as a substitute for multiple inheritance. Traditional multiple inheritance can lead to complications, such as the Diamond Problem, where ambiguity arises due to the presence of two or more inherited classes with a common ancestor.

Avoiding Diamond Problem in Dart

Differing from conventional inheritance, mixins in Dart avoid the Diamond Problem, a complication that arises from multiple inheritance. Dart’s mixin mechanism ensures a linearization order, effectively resolving potential conflicts.

Mixins elevate the flexibility of Dart code by offering an alternative to conventional inheritance.

Best Practices for Mixins in Dart

  1. Keep Mixins Small
  2. Use Descriptive Mixin Names
  3. Understand the Linearization Order

In this tutorial, we’ve explored the fundamentals of mixing in Dart, a powerful feature for enhancing code modularity and reusability

You may also like...