在Ruby中,多态性允许我们使用一个接口来表示不同类型的对象。要实现多态性,我们需要使用方法重写(method overriding)和模块(modules)。
要区分实例变量,我们可以使用instance_variable_get
和instance_variable_set
方法。这两个方法允许我们在运行时访问和修改实例变量,而不需要知道对象的具体类型。这里有一个简单的例子来说明如何使用这些方法区分实例变量:
class Animal
def initialize(name)
@name = name
end
end
class Dog < Animal
def initialize(name, breed)
super(name)
@breed = breed
end
end
class Cat < Animal
def initialize(name, color)
super(name)
@color = color
end
end
def print_animal_info(animal)
puts "Name: #{animal.instance_variable_get(:@name)}"
puts "Breed: #{animal.instance_variable_get(:@breed)}" if animal.is_a?(Dog)
puts "Color: #{animal.instance_variable_get(:@color)}" if animal.is_a?(Cat)
end
dog = Dog.new("Buddy", "Golden Retriever")
cat = Cat.new("Whiskers", "Black")
print_animal_info(dog)
print_animal_info(cat)
在这个例子中,我们定义了一个Animal
基类,以及两个子类Dog
和Cat
。每个子类都有自己的实例变量(@breed
和@color
)。
print_animal_info
方法接受一个Animal
类型的参数。我们可以使用instance_variable_get
方法来访问实例变量,而不需要知道对象的具体类型。我们还使用了is_a?
方法来检查对象是否是Dog
或Cat
类型的实例,以便在访问特定于子类的实例变量时进行条件判断。