Write a program in Elixir that implements "objects".
Here is a Java program to define the behavior we want the Elixir code to have:
abstract class Animal { private String name; // encapsulation public Animal(String name) { this.name = name; } public String getName() { return name; } // encapsulation public abstract void speak(); // abstraction + polymorphism } class Dog extends Animal { public Dog(String name) { super(name); } @Override public void speak() { System.out.println(getName() + " says: Woof!"); } } class Cat extends Animal { public Cat(String name) { super(name); } @Override public void speak() { System.out.println(getName() + " says: Meow!"); } } public class Main { public static void main(String[] args) { Animal a1 = new Dog("Rex"); Animal a2 = new Cat("Whiskers"); a1.speak(); // polymorphism a2.speak(); } }
Your goal is to design and write Elixir code that provides the same OO "pillars" (encapsulation, abstraction, inheritance, and polymorphism) that Java does, but in a functional, actor-based language with no objects, no classes, and no class-based inheritance.
In your Elixir, for processes use the basic spawn_link approach, and do not use higher level packages like GenServer, etc. Just use the basic Elixir language features.