如果没有,如何实现虚函数?有无修饰符号或说明符号提示?
定义个一个空函数,然后在里面抛异常
class Person
def name
raise "请实现该接口"
end
end
class Customer < Person
end
c = Customer.new
c.name #异常了 请实现该接口
def c.name
"实现完了"
end
c.name # 实现完了
@rei @jimrokliu 那怎么使用继承机制完成这种目的?目前我是直接子类继承+override,父类 call overrided function
class P
def aa
puts "aa"
end
def call_aa
self.aa
end
end
class S
def aa
puts "ss aa"
end
end
S.new.call_aa
是这样吗?
class P
def call_hello
self.hello
end
end
class S < P
def hello
puts "Hello World!!!"
end
end
S.new.call_hello # Hello Word!!!
P.new.call_hello # 抛异常 undefined method `hello'
Ruby 实现“OO 多态”的方式和静态语言不同, Ruby 没有接口和虚函数的概念, Ruby 采用的方式是"duck type" 。 所以不需要在基类中定义“纯虚函数”。
因为 Ruby 没有编译过程,所以可以通过运行期的异常,来代替/模拟,静态语言中的编译报错。 比如,可以用 ruby 的“undefined method”的异常,来代替/模拟,静态语言的“MUST be overrided”的编译报错。
如果用 mixin 的方式,倒是可以提示你要实现什么
module Person
def self.included x
ms = x.instance_methods(false)
[:xx, :yy, :zz].each do |xn|
raise "请实现 #{xn} 接口" unless ms.include?(xn)
end
end
end
class Customer
def xx;end
def yy;end
def zz;end
include Person
end
c = Customer.new
c.xx
c.yy
c.zz