> The abstract class defines which methods every class that inherits from it must define by using abstract methods.
In their example, the type checker can infer that Animal has a `talk` method, even if it's never explicitly defined:
abstract class Animal
# no talk method here!
end
class Dog < Animal
def talk
"Woof!"
end
end
class Cat < Animal
def talk
"Miau"
end
end
class Person
getter pet
def initialize(@name : String, @pet : Animal)
end
end
john = Person.new "John", Dog.new
In their own words, “Now the code compiles:”
john.pet.talk #=> "Woof!"
Now, what happens if,
in a separate module, I define a Snake subclass of Animal, without a talk method? What happens in this corner case isn't documented anywhere.
Type system design is very serious business, and can't be done by mindless trial and error. When a type system has a safety hole, patching it is pretty much guaranteed to break other people's code.
In their example, the type checker can infer that Animal has a `talk` method, even if it's never explicitly defined:
In their own words, “Now the code compiles:” Now, what happens if, in a separate module, I define a Snake subclass of Animal, without a talk method? What happens in this corner case isn't documented anywhere.Type system design is very serious business, and can't be done by mindless trial and error. When a type system has a safety hole, patching it is pretty much guaranteed to break other people's code.