开发者社区> boxti> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

ruby实现抽象类和抽象方法

简介:
+关注继续查看
ruby语言本身并没有提供abstract class和abstract method机制。这是ruby的spirit所决定的。但如果我们真的需要定义一个公共抽象类(或者抽象方法)来让子类来实现,又该如何做呢?
    我们可以通过在调用方法时抛出NotImplementedError来防止方法被调用。如(来自《ruby cookbook》的例子):

None.gif class Shape2D
None.gif  def area
None.gif    raise NotImplementedError
.new("#{self.class.name}#area是抽象方法")
None.gif  end
None.gifend 
None.gifclass Square 
< Shape2D
None.gif  def initialize(
length)
None.gif    
@length = length
None.gif  end
None.gif  
None.gif  def area
None.gif    
@length ** 2
None.gif  end
None.gifend


   父类Shape2D的方法area就是我们所需要的“抽象方法”了。你不能直接调用:

None.gifs1=Shape2D.new
None.gifs1
.area

这样调用将抛出错误:Shape2D#area是抽象方法 (NotImplementedError)
Shape2D的子类Square覆写了此方法。由此我们模拟实现了抽象方法。那么抽象类该如何实现呢?自然而然,我们想到如果把类的initialize方法这样处理,那么这样的类将没办法被new生成,不正是我们所需要的抽象类?说干就干:

None.gif class Shape2D
None.gif  def initialize
None.gif    raise NotImplementedError
.new("#{self.class.name}#area是抽象类")
None.gif  end
None.gif  def area
None.gif    raise NotImplementedError
.new("#{self.class.name}#area是抽象方法")
None.gif  end
None.gifend 


当你调用Shape2D.new时,解释器将提示你:Shape2D是抽象类(NotImplementedError)

我们已经实现了抽象方法和抽象类,感觉还是不够好,对每一个需要实现抽象类的类来说,我们都需要去写一句:raise NotImplementedError.new...实在不够爽。ruby鼓励我们去修改类的行为,甚至是标准库,那好,我们修改Class类吧,提供类似attr_reader的声明式服务:
None.gifclass Class
None.gif  def  
None.gif    abstract(
*args)
None.gif    args
.each do |method_name|
None.gif      
None.gif      define_method(method_name) 
do |*args|
None.gif        
if method_name == :initialize   
None.gif          msg 
= "#{self.class.name}是抽象类"
None.gif        
else
None.gif          msg 
= "#{self.class.name}##{method_name}是抽象方法"
None.gif        end
None.gif        raise NotImplementedError
.new(msg)
None.gif        
None.gif      end
None.gif    end
None.gif  end
None.gifend


OK,如此一来,我们的Shape2D可以写成:
None.gif class Shape2D
None.gif    abstract
:initialize,:area  #initialize和area是抽象方法
None.gif
 end



尽管在ruby中,抽象类和抽象方法是否有用存在怀疑,不过知道这样的办法总是不错的主意

文章转自庄周梦蝶  ,原文发布时间5.17

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
推荐 7 款最好的 Ruby on Rails 集成开发环境
Ruby 是个动态面向对象、通用的编程语言。它支持多种编程范式,包括面向功能和面向对象。同时它也包括一个动态类型系统和自动内存管理。 编辑器和集成开发环境(IDE)有些不同,编辑器是用来添加,编辑,查看文件内容的工具,而 IDE 则是一系列大致集中在一个共同任务的工具,比如 Ruby 开发,和所有包含这种形式的编辑器。
190 0
ruby on rails环境搭建
Windows平台 安装RubyStack BitNami RubyStack 提供了快速简单的 Ruby on Rails 的一键安装包,包括:Ruby, Subversion, MySQL, SQLite, ImageMagick, 和许多 Ruby Gems, 同时提供可选安装 Apache 2.
685 0
Ruby On Rails学习笔记(1)——安装Instant Rails
       Instans Rails是一个ROR的一个一站式解决方案,其中包含了Ruby、Rails、Apache和MySQL,并且所有都已经配置完成,可以直接运行。下面是在Windows XP安装和启动Instant Rails的过程。
795 0
利用JS获取IE客户端IP及MAC的实现
在做B/S结构的系统时,我们常常需要获取客户端的一些信息,如IP和MAC,以结合身份验证。在ASP.NET中,要获取服务器端的MAC很容易,但是要获取客户端的MAC的地址确要花费一翻心思,通常的做法是调用Win32API或直接调用nbtstat命令,这样做有很多问题,而另一种方法就是直接用客户端脚本,我们这里用Javascript,这样做的好处是不需要服务器端进行处理,有客户端自行获取,传递到
856 0
+关注
boxti
12535
10005
文章
1326
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载