面试题答案
一键面试设计思路
- 抽象公共部分:将所有类共有的属性和方法提取出来,通过元编程技术批量生成。
- 定义定制接口:为每个类提供一种方式来定义其独特的部分,例如通过传递一个块或者特定的配置参数。
- 使用模块和类方法:利用Ruby的模块来封装公共逻辑,通过类方法来进行类的定义和定制。
关键代码示例
# 定义一个模块来封装公共逻辑
module CommonClassMethods
def common_method
puts "This is a common method"
end
end
# 定义一个方法来生成类
def generate_class(class_name, &block)
new_class = Class.new do
include CommonClassMethods
# 定义公共属性
attr_accessor :common_attribute
# 执行定制块
instance_eval(&block) if block_given?
end
Object.const_set(class_name, new_class)
end
# 生成第一个类,带有独特的方法
generate_class('UniqueClass1') do
def unique_method
puts "This is a unique method for UniqueClass1"
end
end
# 生成第二个类,带有独特的属性
generate_class('UniqueClass2') do
attr_accessor :unique_attribute
end
# 使用生成的类
obj1 = UniqueClass1.new
obj1.common_attribute = "Common value"
obj1.common_method
obj1.unique_method
obj2 = UniqueClass2.new
obj2.common_attribute = "Another common value"
obj2.unique_attribute = "Unique value"
obj2.common_method
在上述代码中:
CommonClassMethods
模块定义了所有生成类共有的方法common_method
。generate_class
方法接受类名和一个可选的块。在这个方法内部,使用Class.new
创建新的类,并包含CommonClassMethods
模块,同时定义公共属性common_attribute
。如果传递了块,则通过instance_eval
执行块,用于定制每个类独特的部分。- 最后生成了
UniqueClass1
和UniqueClass2
两个类,分别展示了如何添加独特的方法和属性。