Skip to content
BytePatterns

Interfaces and Polymorphism

Low-Level Design: lesson 4 of 15

Call one method name and let each type answer in its own way.

Lesson 4 of 15 · 5 min

Interfaces and Polymorphism

Step 1 of 11

An interface is a promise about method names, not about data.

The Idea

An interface is a promise about method names, not about data. Anything honouring the promise is interchangeable, so the caller writes one line and each type supplies its own behaviour. Abstract base classes turn that promise into an error you get at construction time rather than in production.

Real-World Example

A power-tool battery platform. One 18V pack runs the drill, the sander and the site radio. Inside, those tools have nothing in common; the contact block is the whole contract, and a new tool joins the family by matching it.

The Code

from abc import ABC, abstractmethod
class Notifier(ABC):                    # the contract: one method, no data
    @abstractmethod
    def send(self, msg): ...
class Sms(Notifier):
    def send(self, msg): return "sms:" + msg
class Webhook(Notifier):
    def send(self, msg): return "post:" + msg

def fan_out(channels, msg):             # depends on the contract, not the classes
    return [c.send(msg) for c in channels]

print(fan_out([Sms(), Webhook()], "disk full"))
try: Notifier()                         # abstract: refuses to be built
except TypeError: print("contract only")

Python

Your turn

What does this print?

class Plain:
  def tag(self): return "A"

class Loud(Plain):
  def tag(self): return "B"

def show(items): return "".join(x.tag() for x in items)

print(show([Plain(), Loud(), Plain()]))

Mini quiz

1 / 3

Polymorphism lets a caller:

New lessons land every few weeks

Leave an address and we will tell you when the next one is up. That is the only reason we will use it.

One address, stored so we can email you. Nothing else, ever.