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
我认为这是一个一般性的 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