ruby实现抽象类和抽象方法

转载 2007年09月25日 22:33:00
ruby语言本身并没有提供abstract class和abstract method机制。这是ruby的spirit所决定的。但如果我们真的需要定义一个公共抽象类(或者抽象方法)来让子类来实现,又该如何做呢?
    我们可以通过在调用方法时抛出NotImplementedError来防止方法被调用。如(来自《ruby cookbook》的例子):

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


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

s1=Shape2D.new
s1
.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是抽象方法")
  end
end 


当你调用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
  end
end


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


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

C__抽象类与抽象方法

  • 2011年10月24日 15:13
  • 99KB
  • 下载

C#抽象类与抽象方法

  • 2011年05月10日 16:17
  • 99KB
  • 下载

抽象类、抽象方法、接口的区别及实现

一、抽象类、抽象方法 抽象方法:类的成员方法,只有声明,没有实现,把实现交给子类。 抽象类:含有抽象方法的类。 1.有抽象方法的类一定是抽象类,但抽象类里可以没有抽象方法(当然也...
  • aionbo
  • aionbo
  • 2016年10月17日 11:49
  • 664

实现抽象类求面积方法

  • 2015年05月31日 19:27
  • 44KB
  • 下载

面向对象,类的组合关系,继承,实现,方法重写,方法重载,this的使用,抽象方法和抽象类的比较,父类构造方法存在的意义,多态的是用和解析,各种访问修饰符

基本数据类型 也叫值类型。引用数据类型--引用类型 This。只能出现在方法中 ,this代表当前对象的引用。 匿名对象 : new 类名() Anonymous:匿名 Object 有索引...

类的继承、抽象类、虚方法实现

  • 2016年07月27日 10:56
  • 113KB
  • 下载

java 使用抽象方法实现的支票夹

  • 2010年06月21日 14:45
  • 60KB
  • 下载

C# 抽象类和抽象方法详解

首先,在学习抽象方法的时候,我们必须清楚在C#中为什么会存在抽象方法,或者说为什么需要抽象方法。 我们知道,接口可以包含方法的申明和属性,但是方法中不包含代码,实现这个接口的方法必须包含接口...

使用抽象方法实现多态

  • 2009年04月22日 17:02
  • 66KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ruby实现抽象类和抽象方法
举报原因:
原因补充:

(最多只允许输入30个字)