`

ruby实现抽象类和抽象方法

阅读更多
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中,抽象类和抽象方法是否有用存在怀疑,不过知道这样的办法总是不错的主意
分享到:
评论

相关推荐

    abstract_class:Ruby 中的抽象类

    Ruby 中的抽象类。 像模块一样,抽象类不能被实例化。 与模块不同,抽象类可以被继承,并且它们的派生类可以被实例化。 查看或实现以获取其他示例。 安装 gem install abstract_class 要求 Ruby 1.8.7+ 用法 要...

    Ruby-Http2HTTP2协议的纯Ruby实现

    Ruby-Http2库通过`Stream`对象抽象了这一概念,提供了管理流状态和交换数据的方法。 4. **错误处理**:HTTP/2协议定义了一系列错误代码,Ruby-Http2库会根据这些代码抛出相应的异常,帮助开发者识别和处理网络问题...

    Ruby类继承、抽象类、类拓展混入、代理类实例

    总结一下工作中遇到的类扩展: 1、类继承: 当多个类公用很多方法的时候...2、抽象类 当多个类要继承一个类时,用第一种方法,会遇到一个问题。 (引用一个别人的注解来描述抽象类的运用吧https://ihower.tw/rails4/

    Ruby Under a Microscope An Illustrated Guide to Ruby Internals

    尽管从表面来看,类和模块在Ruby中有着明显的区别,但在语言的底层实现中,它们的结构可能非常相似,这对于理解Ruby内部机制以及如何有效地组织代码都非常重要。 此外,本书涉及了Ruby不同版本(包括Ruby 2.x、1.9...

    Ruby编程Ruby Programming

    - **动态性**:Ruby支持运行时修改代码结构,允许开发者在程序运行过程中改变类和方法的行为。 - **元编程能力**:Ruby提供了一种称为元编程的技术,使得程序可以自我修改和自我扩展。 ### 二、Ruby编程基础 #### ...

    Ruby-Ruby中的GoF设计模式实现

    在Ruby中,可以使用模块和类继承来实现抽象工厂,提供一组创建对象的方法。 4. **建造者模式**:将复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。Ruby中可以通过定义构建步骤和最后组装的...

    Ruby语言教程.docx

    继承和多态:掌握继承的概念,以及如何通过多态实现接口和抽象类。 模块和混合: 学习如何使用模块来组织代码,以及如何使用混合(mixins)来重用类的方法。 异常处理: 了解如何使用begin-rescue-ensure-end语句来...

    Working with Ruby Threads

    - **默认线程安全性**:Ruby标准库中的一些类和方法默认是线程安全的,但并非所有都是。 - **使用互斥锁保护数据**:互斥锁(Mutex)是一种常用的同步机制,用于确保一次只有一个线程访问共享资源。通过在关键操作...

    元编程 Ruby

    Ruby中的每个类都拥有一个对应的元类(也称为eigenclass或singleton class),这是实现元编程的关键结构,因为元类允许我们在运行时给类动态地添加方法和属性。 Ruby的元编程能力在Rails框架中得到了广泛的应用。...

    Ruby不完全读书指南.rar

    对象则是类的实例,具有类所定义的特性和方法。Ruby支持单一继承,但通过模块(Module)可以实现多重继承的效果,提供了一种灵活的代码复用机制。 Ruby的语法简洁明了,变量声明无需指定类型,会根据值自动推断。它...

    将Zoho的API抽象为一组Ruby类,使用更熟悉的ActiveRe.zip

    为了解决这个问题,开发者可以创建一个抽象层,将Zoho的API转换为更加友好和易于使用的Ruby类,就像`ActiveRecord`那样。 `ActiveRecord`是Ruby on Rails框架的一个核心组件,它提供了一个ORM(对象关系映射)层,...

    Ruby - Ruby for Rails

    - **集合操作**:介绍集合的概念及其在 Ruby 中的实现方法。 - **枚举器**:讲解如何使用枚举器(enumerator)来迭代处理集合中的元素。 以上内容覆盖了 Ruby 和 Rails 的基础知识、核心概念和高级特性,对于初学者...

    Ruby语言中文教程

    通过这个中文教程,你将掌握Ruby语言的基础知识,包括语法、对象系统、控制结构、数据结构、类和模块、异常处理、方法与闭包以及元编程。同时,了解Ruby的生态系统,能够利用Gem管理和使用社区的资源,提升开发效率...

    《Ruby从入门到精通》PDF版本下载.txt

    4. **接口与抽象类**:虽然Ruby本身不支持接口或抽象类,但可以通过其他方式实现类似功能。 ### 四、Ruby高级特性 1. **元编程**:利用Ruby强大的元编程能力,可以动态地修改或扩展程序的行为。 2. **线程与并发**...

    实例讲解Ruby使用设计模式中的装饰器模式的方法

    装饰器模式的实现始于 `WriterDecorator` 类,这是一个抽象基类,它接收一个 `real_writer` 对象作为参数,并提供了与 `SimpleWriter` 相同的接口,如 `write_line`, `pos`, `rewind`, 和 `close` 方法。这样,`...

    Metaprogramming.Ruby

    通过元编程,开发人员可以在不牺牲代码清晰性和可读性的情况下实现更高级别的抽象和复用。 #### 三、读者反馈与评价 多位读者对本书给予了高度评价: - **Sebastian Hennebrüder**(Java顾问和培训师)提到,在...

    Ruby-OAuth2一个OAuth20协议的Ruby封装

    总之,Ruby-OAuth2是Ruby开发者实现OAuth 2.0授权的重要工具,它通过简洁的接口和易于理解的API,降低了与OAuth 2.0服务器通信的复杂性,使得开发者可以专注于构建功能丰富的应用,而不用担心授权和身份验证的安全...

    Design Patterns in Ruby Dec 2007.rar

    这些设计模式在Ruby中的应用不仅限于上述描述,实际上,Ruby的灵活性和动态特性使得许多传统设计模式有了新的解释和实现方式。通过学习和实践这些模式,开发者可以更好地理解和掌握Ruby的编程哲学,从而写出更高质量...

    Ruby中文教程,佩戴实例

    Ruby还引入了模块(module)和类(class),用于组织代码和实现多态性。类是创建对象的蓝图,而模块则可以用来封装方法,实现命名空间,或通过`include`关键字混入类的方法。 面向对象编程在Ruby中尤为重要。你将...

    Ruby on Rails中文指南

    10. **会话(Sessions)**和**cookies**:Rails提供了内置的会话管理和cookie支持,用于跟踪用户状态和实现用户认证。 11. **测试(Testing)**:Rails鼓励TDD(Test-Driven Development),提供了丰富的测试工具,...

Global site tag (gtag.js) - Google Analytics