Lably
Skip to content

Interface (object-oriented programming)

Abstraction of a class

  • 4 min read
  • 1 chapter

Learn it on Lably

Interfaces are useful for encapsulation and reducing coupling. For example, in Java, the java.lang.Comparable<T> interface specifies the method compareTo(). Thus, a sorting method only needs to take objects of types which implement java.lang.Comparable<T> to sort them, without knowing about the inner nature of the class (except that two of these objects can be compared via compareTo()).

Examples

Some programming languages provide explicit language support for interfaces: Ada, C#, D, Dart, Delphi, Go, Java, Logtalk, Object Pascal, Objective-C, OCaml, PHP, Racket, Swift, Python 3.8. In languages supporting multiple inheritance, such as C++, interfaces are abstract classes.

In Java, an implementation of interfaces may look like:

<span id="mwPg"></span><span class="kd" id="mwPw">class</span> <span class="nc" id="mwQA">Animal</span><span class="w" id="mwQQ"> </span><span class="p" id="mwQg">{</span><span class="w" id="mwQw"> </span><span class="p" id="mwRA">...</span><span class="w" id="mwRQ"> </span><span class="p" id="mwRg">}</span> <span class="kd" id="mwRw">class</span> <span class="nc" id="mwSA">Theropod</span><span class="w" id="mwSQ"> </span><span class="kd" id="mwSg">extends</span><span class="w" id="mwSw"> </span><span class="n" id="mwTA">Animal</span><span class="w" id="mwTQ"> </span><span class="p" id="mwTg">{</span><span class="w" id="mwTw"> </span><span class="p" id="mwUA">...</span><span class="w" id="mwUQ"> </span><span class="p" id="mwUg">}</span> <span class="kd" id="mwUw">interface</span> <span class="nc" id="mwVA">Flyable</span><span class="w" id="mwVQ"> </span><span class="p" id="mwVg">{</span> <span class="w" id="mwVw"> </span><span class="kt" id="mwWA">void</span><span class="w" id="mwWQ"> </span><span class="nf" id="mwWg">fly</span><span class="p" id="mwWw">();</span> <span class="p" id="mwXA">}</span> <span class="kd" id="mwXQ">interface</span> <span class="nc" id="mwXg">Vocal</span><span class="w" id="mwXw"> </span><span class="p" id="mwYA">{</span> <span class="w" id="mwYQ"> </span><span class="kt" id="mwYg">void</span><span class="w" id="mwYw"> </span><span class="nf" id="mwZA">vocalize</span><span class="p" id="mwZQ">();</span> <span class="p" id="mwZg">}</span> <span class="kd" id="mwZw">public</span><span class="w" id="mwaA"> </span><span class="kd" id="mwaQ">class</span> <span class="nc" id="mwag">Bird</span><span class="w" id="mwaw"> </span><span class="kd" id="mwbA">extends</span><span class="w" id="mwbQ"> </span><span class="n" id="mwbg">Theropod</span><span class="w" id="mwbw"> </span><span class="kd" id="mwcA">implements</span><span class="w" id="mwcQ"> </span><span class="n" id="mwcg">Flyable</span><span class="p" id="mwcw">,</span><span class="w" id="mwdA"> </span><span class="n" id="mwdQ">Vocal</span><span class="w" id="mwdg"> </span><span class="p" id="mwdw">{</span> <span class="w" id="mweA"> </span><span class="c1" id="mweQ">// ...</span> <span class="w" id="mweg"> </span><span class="kd" id="mwew">public</span><span class="w" id="mwfA"> </span><span class="kt" id="mwfQ">void</span><span class="w" id="mwfg"> </span><span class="nf" id="mwfw">fly</span><span class="p" id="mwgA">()</span><span class="w" id="mwgQ"> </span><span class="p" id="mwgg">{</span><span class="w" id="mwgw"> </span><span class="p" id="mwhA">...</span><span class="w" id="mwhQ"> </span><span class="p" id="mwhg">}</span> <span class="w" id="mwhw"> </span><span class="kd" id="mwiA">public</span><span class="w" id="mwiQ"> </span><span class="kt" id="mwig">void</span><span class="w" id="mwiw"> </span><span class="nf" id="mwjA">vocalize</span><span class="p" id="mwjQ">()</span><span class="w" id="mwjg"> </span><span class="p" id="mwjw">{</span><span class="w" id="mwkA"> </span><span class="p" id="mwkQ">...</span><span class="w" id="mwkg"> </span><span class="p" id="mwkw">}</span> <span class="p" id="mwlA">}</span>

In languages without explicit support, interfaces are often still present as conventions; this is known as duck typing. For example, in Python, any class can implement an __iter__ method and be used as an iterable. Classes may also explicitly subclass an ABC, such as collections.abc.Iterable.

Type classes in languages like Haskell, or module signatures in ML and OCaml, are used for many of the same things as are interfaces.

In Rust, interfaces are called traits. In Rust, a struct does not contain methods, but may add methods through separate impl blocks:

<span id="mwsg"></span><span class="k" id="mwsw">trait</span><span class="w" id="mwtA"> </span><span class="n" id="mwtQ">Pet</span><span class="w" id="mwtg"> </span><span class="p" id="mwtw">{</span> <span class="w" id="mwuA"> </span><span class="k" id="mwuQ">fn</span><span class="w" id="mwug"> </span><span class="nf" id="mwuw">speak</span><span class="p" id="mwvA">(</span><span class="o" id="mwvQ">&</span><span class="bp" id="mwvg">self</span><span class="p" id="mwvw">);</span> <span class="p" id="mwwA">}</span> <span class="k" id="mwwQ">struct</span><span class="w" id="mwwg"> </span><span class="nc" id="mwww">Dog</span><span class="w" id="mwxA"> </span><span class="p" id="mwxQ">{</span> <span class="w" id="mwxg"> </span><span class="c1" id="mwxw">// Structs only contain their fields</span> <span class="w" id="mwyA"> </span><span class="n" id="mwyQ">name</span><span class="p" id="mwyg">:</span><span class="w" id="mwyw"> </span><span class="nb" id="mwzA">String</span> <span class="p" id="mwzQ">}</span> <span class="k" id="mwzg">impl</span><span class="w" id="mwzw"> </span><span class="n" id="mw0A">Dog</span><span class="w" id="mw0Q"> </span><span class="p" id="mw0g">{</span> <span class="w" id="mw0w"> </span><span class="c1" id="mw1A">// Not from a trait</span> <span class="w" id="mw1Q"> </span><span class="k" id="mw1g">fn</span><span class="w" id="mw1w"> </span><span class="nf" id="mw2A">new</span><span class="p" id="mw2Q">(</span><span class="n" id="mw2g">name</span><span class="p" id="mw2w">:</span><span class="w" id="mw3A"> </span><span class="nb" id="mw3Q">String</span><span class="p" id="mw3g">)</span><span class="w" id="mw3w"> </span><span class="p" id="mw4A">-></span><span class="w" id="mw4Q"> </span><span class="nc" id="mw4g">Self</span><span class="w" id="mw4w"> </span><span class="p" id="mw5A">{</span> <span class="w" id="mw5Q"> </span><span class="n" id="mw5g">Dog</span><span class="w" id="mw5w"> </span><span class="p" id="mw6A">{</span><span class="w" id="mw6Q"> </span><span class="n" id="mw6g">name</span><span class="w" id="mw6w"> </span><span class="p" id="mw7A">}</span> <span class="w" id="mw7Q"> </span><span class="p" id="mw7g">}</span> <span class="p" id="mw7w">}</span> <span class="k" id="mw8A">impl</span><span class="w" id="mw8Q"> </span><span class="n" id="mw8g">Pet</span><span class="w" id="mw8w"> </span><span class="k" id="mw9A">for</span><span class="w" id="mw9Q"> </span><span class="n" id="mw9g">Dog</span><span class="w" id="mw9w"> </span><span class="p" id="mw-A">{</span> <span class="w" id="mw-Q"> </span><span class="c1" id="mw-g">// From a trait</span> <span class="w" id="mw-w"> </span><span class="k" id="mw_A">fn</span><span class="w" id="mw_Q"> </span><span class="nf" id="mw_g">speak</span><span class="p" id="mw_w">(</span><span class="o" id="mwAQA">&</span><span class="bp" id="mwAQE">self</span><span class="p" id="mwAQI">)</span><span class="w" id="mwAQM"> </span><span class="p" id="mwAQQ">{</span> <span class="w" id="mwAQU"> </span><span class="fm" id="mwAQY">println!</span><span class="p" id="mwAQc">(</span><span class="s" id="mwAQg">"{} says 'Woof!'"</span><span class="p" id="mwAQk">,</span><span class="w" id="mwAQo"> </span><span class="bp" id="mwAQs">self</span><span class="p" id="mwAQw">.</span><span class="n" id="mwAQ0">name</span><span class="p" id="mwAQ4">);</span> <span class="w" id="mwAQ8"> </span><span class="p" id="mwARA">}</span> <span class="p" id="mwARE">}</span> <span class="k" id="mwARI">fn</span><span class="w" id="mwARM"> </span><span class="nf" id="mwARQ">main</span><span class="p" id="mwARU">()</span><span class="w" id="mwARY"> </span><span class="p" id="mwARc">{</span> <span class="w" id="mwARg"> </span><span class="kd" id="mwARk">let</span><span class="w" id="mwARo"> </span><span class="n" id="mwARs">dog</span><span class="w" id="mwARw"> </span><span class="o" id="mwAR0">=</span><span class="w" id="mwAR4"> </span><span class="n" id="mwAR8">Dog</span><span class="p" id="mwASA">::</span><span class="n" id="mwASE">new</span><span class="p" id="mwASI">(</span><span class="nb" id="mwASM">String</span><span class="p" id="mwASQ">::</span><span class="n" id="mwASU">from</span><span class="p" id="mwASY">(</span><span class="s" id="mwASc">"Arlo"</span><span class="p" id="mwASg">));</span> <span class="w" id="mwASk"> </span><span class="n" id="mwASo">dog</span><span class="p" id="mwASs">.</span><span class="n" id="mwASw">speak</span><span class="p" id="mwAS0">();</span> <span class="p" id="mwAS4">}</span>

In C++, there are multiple ways to resemble interfaces. One such way is the Java-style interface, which is done using abstract classes. The other, which resembles Go interfaces, is using concepts. Unlike inheritance, with concepts any type may satisfy a concept (not just classes) so long as it satisfies all of its requirements.

More in Computing and communication