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.gif s1 = 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.gif class 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

目录
相关文章
|
2月前
|
Ruby
|
2月前
|
Ruby
|
1月前
|
数据采集 Web App开发 数据处理
Ruby网络爬虫教程:从入门到精通下载图片
Ruby网络爬虫教程:从入门到精通下载图片
|
2月前
|
JSON 数据格式 Ruby
|
2月前
|
JSON Ubuntu Linux
|
2月前
|
存储 JSON 数据格式
|
2月前
|
安全 Ruby
|
2月前
|
调度 Ruby
|
2月前
|
人工智能 BI 计算机视觉
|
2月前
|
Ruby