Crystal - 如何在父类的子类中共享属性 and/or 类型

Crystal - How to have shared attributes and/or type among subclasses of parent

我认为这是一个一般性的 OOP 问题,但我使用 Crystal 就此而言。

处理我有子 类 需要共享一个类型但该类型不是父类型的情况的正确方法是什么。例如,假设我有动物:猫和狗,还有小动物:小猫和小狗。我希望小猫和小狗有自己的一套 "parent" 方法。

class Animal
end
class Dog < Animal
end
class Cat < Animal
end
class Puppy < Dog
  property? needs_milk = true
end
class Kitten < Cat
  property? needs_milk = true
end

我知道如果我只需要一些属性或方法,我可以通过混合来实现:

module BabyAnimal
  property? needs_milk = true
end

但对于我的实际用例,我想保证数组 "are" BabyAnimals 的所有成员(因此具有小动物方法和属性)即

[] of Kitten | Puppy

所以感觉继承是唯一/正确的方法。

还是我遗漏了什么?

模块是类型层次结构的一部分。如果您使用类型限制 BabyAnimal,您可以确信它只匹配包含该模块的类型。

Kitten.new.is_a?(BabyAnimal) # => true

array = [] of BabyAnimal
array << Kitten.new
array << Puppy.new