<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Hossein HassanNejad</title>
    <description>The latest articles on DEV Community by Hossein HassanNejad (@husen).</description>
    <link>https://dev.to/husen</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F826717%2F1cc19cd3-b662-438c-9c10-75c3cc6fe76e.jpeg</url>
      <title>DEV Community: Hossein HassanNejad</title>
      <link>https://dev.to/husen</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/husen"/>
    <language>en</language>
    <item>
      <title>Abstracts vs Interfaces in Dart</title>
      <dc:creator>Hossein HassanNejad</dc:creator>
      <pubDate>Thu, 27 Feb 2025 20:01:10 +0000</pubDate>
      <link>https://dev.to/husen/abstracts-vs-interfaces-in-dart-306e</link>
      <guid>https://dev.to/husen/abstracts-vs-interfaces-in-dart-306e</guid>
      <description>&lt;ul&gt;
&lt;li&gt;Introduction&lt;/li&gt;
&lt;li&gt;
abstract class

&lt;ul&gt;
&lt;li&gt;Example&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

interface

&lt;ul&gt;
&lt;li&gt;Example&lt;/li&gt;
&lt;li&gt;
interface class

&lt;ul&gt;
&lt;li&gt;Example&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;/li&gt;

&lt;li&gt;Differences&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Introduction &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;The concepts of &lt;code&gt;abstract Class&lt;/code&gt;es and &lt;code&gt;interface&lt;/code&gt;s are fundamental to object-oriented programming. They are used to define &lt;strong&gt;contracts&lt;/strong&gt; and &lt;strong&gt;behaviors&lt;/strong&gt; that classes must follow, but they serve different purposes and have distinct characteristics.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;code&gt;abstract Class&lt;/code&gt; &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;An &lt;code&gt;abstract class&lt;/code&gt; is a special type of class that &lt;strong&gt;cannot be instantiated directly&lt;/strong&gt;. Instead, it acts as a &lt;strong&gt;blueprint&lt;/strong&gt; or &lt;strong&gt;template&lt;/strong&gt; for other classes. Its primary purpose is to provide a &lt;strong&gt;common base&lt;/strong&gt; that can be shared by multiple subclasses, while also enforcing specific methods or behaviors that those subclasses must implement.&lt;/p&gt;

&lt;p&gt;In Dart, abstract classes support &lt;strong&gt;single inheritance&lt;/strong&gt;, meaning a class can extend only one &lt;code&gt;abstract class&lt;/code&gt;. They are versatile because they can include &lt;strong&gt;fields&lt;/strong&gt;, &lt;strong&gt;constructors&lt;/strong&gt;, and &lt;strong&gt;concrete methods&lt;/strong&gt; (methods with implementation). Unlike interfaces, abstract classes can provide a &lt;strong&gt;partial implementation&lt;/strong&gt;, allowing subclasses to inherit and reuse some behavior while requiring them to implement specific parts. This makes abstract classes a powerful tool for creating structured, reusable, and maintainable code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Abstract class acting as a blueprint for vehicles&lt;/span&gt;
&lt;span class="kd"&gt;abstract&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Vehicle&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Field&lt;/span&gt;
  &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;maxSpeed&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Field&lt;/span&gt;

  &lt;span class="c1"&gt;// Constructor&lt;/span&gt;
  &lt;span class="n"&gt;Vehicle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;maxSpeed&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Abstract method (must be implemented by subclasses)&lt;/span&gt;
  &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="c1"&gt;// Concrete method (default implementation)&lt;/span&gt;
  &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;stop&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="si"&gt;$name&lt;/span&gt;&lt;span class="s"&gt; has stopped.'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="c1"&gt;// Another concrete method&lt;/span&gt;
  &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;displayInfo&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Vehicle: &lt;/span&gt;&lt;span class="si"&gt;$name&lt;/span&gt;&lt;span class="s"&gt;, Max Speed: &lt;/span&gt;&lt;span class="si"&gt;$maxSpeed&lt;/span&gt;&lt;span class="s"&gt; km/h'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Subclass Car extending the abstract class Vehicle&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Car&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;Vehicle&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;Car&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;maxSpeed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;maxSpeed&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="si"&gt;$name&lt;/span&gt;&lt;span class="s"&gt; is starting... Vroom Vroom!'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Subclass Bicycle extending the abstract class Vehicle&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Bicycle&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;Vehicle&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;Bicycle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;String&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;maxSpeed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;maxSpeed&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="si"&gt;$name&lt;/span&gt;&lt;span class="s"&gt; is starting... Pedal Pedal!'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Create instances of Car and Bicycle&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;car&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Car&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Tesla Model S'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;250&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;bicycle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Bicycle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Mountain Bike'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// Use methods from the abstract class and subclasses&lt;/span&gt;
  &lt;span class="n"&gt;car&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;displayInfo&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Output: Vehicle: Tesla Model S, Max Speed: 250 km/h&lt;/span&gt;
  &lt;span class="n"&gt;car&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;       &lt;span class="c1"&gt;// Output: Tesla Model S is starting... Vroom Vroom!&lt;/span&gt;
  &lt;span class="n"&gt;car&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stop&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;        &lt;span class="c1"&gt;// Output: Tesla Model S has stopped.&lt;/span&gt;

  &lt;span class="n"&gt;bicycle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;displayInfo&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Output: Vehicle: Mountain Bike, Max Speed: 30 km/h&lt;/span&gt;
  &lt;span class="n"&gt;bicycle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;start&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;       &lt;span class="c1"&gt;// Output: Mountain Bike is starting... Pedal Pedal!&lt;/span&gt;
  &lt;span class="n"&gt;bicycle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;stop&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;        &lt;span class="c1"&gt;// Output: Mountain Bike has stopped.&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;code&gt;interface&lt;/code&gt; &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;An &lt;code&gt;interface&lt;/code&gt; is a &lt;strong&gt;contract&lt;/strong&gt; or &lt;strong&gt;blueprint&lt;/strong&gt; that defines a set of methods and properties a class must implement. It specifies &lt;strong&gt;what&lt;/strong&gt; a class should do without dictating &lt;strong&gt;how&lt;/strong&gt; it should do it. Interfaces enforce a consistent structure across unrelated classes, enabling &lt;strong&gt;polymorphism&lt;/strong&gt; and allowing different classes to be used interchangeably as long as they implement the same interface.&lt;/p&gt;

&lt;p&gt;Key characteristics of interfaces include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;They cannot be instantiated directly.&lt;/li&gt;
&lt;li&gt;A class can implement multiple interfaces, allowing it to adhere to multiple contracts simultaneously.&lt;/li&gt;
&lt;li&gt;Pure interfaces (in most languages) cannot have fields or constructors; they focus solely on defining behavior.&lt;/li&gt;
&lt;li&gt;Interfaces promote loose coupling and modularity by separating what a class should do from how it does it.&lt;/li&gt;
&lt;li&gt;They define a strict contract without implementation, ensuring flexibility and consistency in design.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By using interfaces, developers can create systems where different classes work together seamlessly, as long as they adhere to the same contract, making code more modular, reusable, and maintainable.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example (&lt;code&gt;abstract interface class&lt;/code&gt;) &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Interface defining a contract for objects that can be drawn&lt;/span&gt;
&lt;span class="kd"&gt;abstract&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Drawable&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Contract method (no implementation)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Interface defining a contract for objects that can be resized&lt;/span&gt;
&lt;span class="kd"&gt;abstract&lt;/span&gt; &lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Resizable&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;resize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;scale&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Contract method (no implementation)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Class Circle implementing both Drawable and Resizable interfaces&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Circle&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="n"&gt;Drawable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Resizable&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Drawing a Circle'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;resize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;scale&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Resizing Circle by scale &lt;/span&gt;&lt;span class="si"&gt;$scale&lt;/span&gt;&lt;span class="s"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Class Square implementing the Drawable interface&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Square&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="n"&gt;Drawable&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nd"&gt;@override&lt;/span&gt;
  &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Drawing a Square'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Create instances of Circle and Square&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;circle&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Circle&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;square&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Square&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="c1"&gt;// Use methods from the interfaces&lt;/span&gt;
  &lt;span class="n"&gt;circle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Output: Drawing a Circle&lt;/span&gt;
  &lt;span class="n"&gt;circle&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;resize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;2.0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Output: Resizing Circle by scale 2.0&lt;/span&gt;

  &lt;span class="n"&gt;square&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Output: Drawing a Square&lt;/span&gt;

  &lt;span class="c1"&gt;// Polymorphism in action&lt;/span&gt;
  &lt;span class="kt"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Drawable&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;shapes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;circle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;square&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="n"&gt;shape&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;shapes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;shape&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Calls the draw() method of each shape&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  &lt;code&gt;interface class&lt;/code&gt; &lt;a&gt;&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;An &lt;code&gt;interface class&lt;/code&gt; can include both &lt;strong&gt;concrete methods&lt;/strong&gt; (with implementation) and &lt;strong&gt;abstract methods&lt;/strong&gt; (without implementation). It can also have &lt;strong&gt;fields&lt;/strong&gt; and &lt;strong&gt;constructors&lt;/strong&gt;. A class can implement multiple &lt;code&gt;interface class&lt;/code&gt;es, and the &lt;code&gt;interface class&lt;/code&gt; itself can be instantiated directly unless marked as &lt;code&gt;abstract&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The primary use case for an &lt;code&gt;interface class&lt;/code&gt; is when you want to define a &lt;strong&gt;contract&lt;/strong&gt; while also providing &lt;strong&gt;default behavior&lt;/strong&gt; that implementing classes can use or override. In other words, it defines a contract with &lt;strong&gt;optional default behavior&lt;/strong&gt;, making it ideal for scenarios where you want to share common functionality across multiple classes while still allowing flexibility for customization.&lt;/p&gt;

&lt;p&gt;If the &lt;code&gt;interface class&lt;/code&gt; has no abstract methods (only concrete methods), it &lt;strong&gt;can be instantiated directly&lt;/strong&gt;. However, if the &lt;code&gt;interface class&lt;/code&gt; contains &lt;strong&gt;abstract methods&lt;/strong&gt;, it &lt;strong&gt;cannot be instantiated directly&lt;/strong&gt; unless those methods are implemented.&lt;/p&gt;

&lt;h4&gt;
  
  
  Example &lt;a&gt;&lt;/a&gt;
&lt;/h4&gt;

&lt;h5&gt;
  
  
  Can Be Instantiated
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Drawable&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;'Drawing something'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;final&lt;/span&gt; &lt;span class="n"&gt;drawable&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Drawable&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Can be instantiated&lt;/span&gt;
  &lt;span class="n"&gt;drawable&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Output: Drawing something&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  Cannot Be Instantiated
&lt;/h5&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight dart"&gt;&lt;code&gt;&lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Drawable&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;// Abstract method&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// final drawable = Drawable(); // Error: Cannot instantiate an abstract class&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Differences &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Abstract classes&lt;/strong&gt; are used when you want to provide a &lt;strong&gt;base implementation&lt;/strong&gt; that subclasses can reuse, enforce specific methods that subclasses must implement, and share &lt;strong&gt;common behavior&lt;/strong&gt; among related classes while offering a &lt;strong&gt;partial implementation&lt;/strong&gt;. On the other hand, &lt;strong&gt;interfaces&lt;/strong&gt; are used when you want to define a &lt;strong&gt;strict contract&lt;/strong&gt; that multiple unrelated classes must follow, and enforce a &lt;strong&gt;consistent structure&lt;/strong&gt; across different classes without providing any implementation. Abstract classes are ideal for creating a shared foundation, while interfaces are perfect for ensuring flexibility and consistency across diverse classes.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;&lt;code&gt;abstract class&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;abstract interface class&lt;/code&gt;&lt;/th&gt;
&lt;th&gt;&lt;code&gt;interface class&lt;/code&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Purpose&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Provides a &lt;strong&gt;partial implementation&lt;/strong&gt;.&lt;/td&gt;
&lt;td&gt;Defines a &lt;strong&gt;pure interface&lt;/strong&gt; (no implementation).&lt;/td&gt;
&lt;td&gt;Defines a contract &lt;strong&gt;with optional default behavior&lt;/strong&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Methods&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Can have &lt;strong&gt;abstract&lt;/strong&gt; and &lt;strong&gt;concrete&lt;/strong&gt; methods.&lt;/td&gt;
&lt;td&gt;Can only have &lt;strong&gt;abstract&lt;/strong&gt; methods.&lt;/td&gt;
&lt;td&gt;Can have &lt;strong&gt;concrete&lt;/strong&gt; and &lt;strong&gt;abstract&lt;/strong&gt; methods.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fields&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Can have &lt;strong&gt;fields&lt;/strong&gt; and &lt;strong&gt;constructors&lt;/strong&gt;.&lt;/td&gt;
&lt;td&gt;Cannot have &lt;strong&gt;fields&lt;/strong&gt; or &lt;strong&gt;constructors&lt;/strong&gt;.&lt;/td&gt;
&lt;td&gt;Can have &lt;strong&gt;fields&lt;/strong&gt; and &lt;strong&gt;constructors&lt;/strong&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Instantiation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cannot be instantiated directly.&lt;/td&gt;
&lt;td&gt;Cannot be instantiated directly.&lt;/td&gt;
&lt;td&gt;Can be instantiated directly (unless marked as &lt;code&gt;abstract&lt;/code&gt;).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Inheritance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A class can extend &lt;strong&gt;only one&lt;/strong&gt; abstract class.&lt;/td&gt;
&lt;td&gt;A class can implement &lt;strong&gt;multiple&lt;/strong&gt; abstract interface classes.&lt;/td&gt;
&lt;td&gt;A class can implement &lt;strong&gt;multiple&lt;/strong&gt; interface classes.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Use Case&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;When you want to share &lt;strong&gt;common behavior&lt;/strong&gt; among subclasses.&lt;/td&gt;
&lt;td&gt;When you want to enforce a &lt;strong&gt;strict contract&lt;/strong&gt;.&lt;/td&gt;
&lt;td&gt;When you want to define a contract with &lt;strong&gt;optional default behavior&lt;/strong&gt;.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>dart</category>
      <category>flutter</category>
      <category>oop</category>
      <category>fundamental</category>
    </item>
  </channel>
</rss>
