本站首页    管理页面    写新日志    退出


«August 2025»
12
3456789
10111213141516
17181920212223
24252627282930
31


公告
 本博客在此声明所有文章均为转摘,只做资料收集使用。

我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:
日志总数:1304
评论数量:2242
留言数量:5
访问次数:7583335
建立时间:2006年5月29日




[Ruby on Rails]ruby实现抽象类和抽象方法
软件技术

lhwork 发表于 2007/2/7 8:49:20

    ruby语言本身并没有提供abstract class和abstract method机制。这是ruby的spirit所决定的。但如果我们真的需要定义一个公共抽象类(或者抽象方法)来让子类来实现,又该如何做呢?    我们可以通过在调用方法时抛出NotImplementedError来防止方法被调用。如(来自《ruby cookbook》的例子): class Shape2D  def area    raise NotImplementedError.new("#{self.class.name}#area是抽象方法")  endend class Square < Shape2D  def initialize(length)    @length = length  end    def area    @length ** 2  endend   父类Shape2D的方法area就是我们所需要的“抽象方法”了。你不能直接调用:s1=Shape2D.news1.area这样调用将抛出错误:Shape2D#area是抽象方法 (NotImplementedError)Shape2D的子类Square覆写了此方法。由此我们模拟实现了抽象方法。那么抽象类该如何实现呢?自然而然,我们想到如果把类的initialize方法这样处理,那么这样的类将没办法被new生成,不正是我们所需要的抽象类?说干就干: class Shape2D  def initialize    raise NotImplementedError.new("#{self.class.name}#area是抽象类")  end  def area    raise NotImplementedError.new("#{self.class.name}#area是抽象方法")  endend 当你调用Shape2D.new时,解释器将提示你:Shape2D是抽象类(NotImplementedError)我们已经实现了抽象方法和抽象类,感觉还是不够好,对每一个需要实现抽象类的类来说,我们都需要去写一句:raise NotImplementedError.new...实在不够爽。ruby鼓励我们去修改类的行为,甚至是标准库,那好,我们修改Class类吧,提供类似attr_reader的声明式服务:class Class  def      abstract(*args)    args.each do |method_name|            define_method(method_name) do |*args|        if method_name == :initialize             msg = "#{self.class.name}是抽象类"        else          msg = "#{self.class.name}##{method_name}是抽象方法"        end        raise NotImplementedError.new(msg)              end    end  endendOK,如此一来,我们的Shape2D可以写成: class Shape2D    abstract:initialize,:area  #initialize和area是抽象方法 end尽管在ruby中,抽象类和抽象方法是否有用存在怀疑,不过知道这样的办法总是不错的主意。


阅读全文(1918) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.045 second(s), page refreshed 144766559 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号