• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell
您的位置:首页 > 脚本语言 >ruby > Ruby类继承、抽象类、类拓展混入、代理类实例

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

作者:junjie 字体:[增加 减小] 来源:互联网

junjie 通过本文主要向大家介绍了混入类,ruby 类变量,ruby 类,ruby,ruby rose等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

总结一下工作中遇到的类扩展:

1、类继承:

当多个类公用很多方法的时候可以将公用方法部分抽取出来,需要的类做相关继承。

例子:

class A < ActiveRecord::Base
    def a
        p "it was a "
    end
end

class B<A
end

class C<A
end

B.new.a #=>"it was a "
C.new.a #=>"it was a "

</div>

2、抽象类

当多个类要继承一个类时,用第一种方法,会遇到一个问题。
(引用一个别人的注解来描述抽象类的运用吧https://ihower.tw/rails4/activerecord-others.html)

單一表格繼承STI(Single-table inheritance)

如何將物件導向中的繼承概念,對應到關聯式資料庫的設計,是個大哉問。Rails內建了其中最簡單的一個解法,只用一個資料表儲存繼承體系中的物件,搭配一個type欄位用來指名這筆資料的類別名稱。

要開啟STI功能,依照慣例只要有一個欄位叫做type,型態字串即可。假設以下的posts資料表有欄位叫做type,那麼這三個Models實際上就會共用posts一個資料表,當然,還有這兩個子類別也都繼承到父類別的validates_presence_of :subject:
class Post < ActiveRecord::Base 
    validates_presence_of :subject 
end 
 
class GuestPost < Post 
end 
 
class MemberPost < Post 
end 
</div>

讓我們進入rails console實驗看看,Rails會根據你使用的類別,自動去設定type欄位:

post = GuestPost.create( :subject => "guest")
post.type # "GuestPost"
post.id # 1
post = MemberPost.create( :subject => "member" )
post.id # 2
post.type # "MemberPost"
GuestPost.last # 1
</div>

很遺憾,也因為這個慣例的關係,你不能將type這麼名字挪做它用。
STI最大的問題在於欄位的浪費,如果繼承體系中交集的欄位不多,那麼使用STI就會非常的浪費空間。如果有較多的不共用的欄位,筆者會建議不要使用這個功能,讓個別的類別有自己的資料表。要關閉STI,請父類別加上self.abstract_class = true
class Post < ActiveRecord::Base 
    self.abstract_class = true 
end 
 
class GuestPost < Post 
end 
 
class MemberPost < Post 
end 
</div>

這裡的GuestPost和MemberPost就需要有自己的Migrations建立guest_posts和member_posts資料表。

你还可以在某个类中,引入多个依赖
class Dependency<Post 
    require_dependency 'guestpost' 
    require_dependency 'memberpost' 
end 
</div>

3、类拓展混入

ruby的类是单继承的,要实现多继承的功能需要用mixin(参合模式)的方式,即类拓展混入来实现。例子:
module Extract 
  def self.included(base) 
     base.extend(ClassMethods) 
  end 
  module ClassMethods 
     def a 
        p "it was a " 
     end 
  end 
end   
 
class A<ActiveRecord::Base 
  include Extract 
end 
 
A.new.a  #=>"it was a" 
</div>

4、代理类

当某个功能是比较复杂的,当然写再lib中,作为一个面向函数的方法去处理很简单,也可以用代理类的方式实现面向对象的调用。

例子:
class A<ActiveRecord::Base
 def generate_schedule
    generator =  Generator::ExcelGenerator.new(self)
    generator.generate_schedule
  end
end

module Generator
  class ExcelGenerator

    attr_reader :excel,:workbook,:a,:worksheet
    attr_accessor :styles

    def initialize(a)
      @excel ||= Axlsx::Package.new
      @workbook ||= @excel.workbook
      @worksheet = @workbook.add_worksheet(:name => '测试生成一个excel文件')
      @a ||= a
      @styles ||= Hash.new
    end
   
    def generate_schedule
        #excel内容的具体定义
    end

  end
end

A.new.generate_schedule 就可以通过代理类ExcelGenerator实现一个A的类实例方法generate_schedule
</div>

当然也可以通过include 一个model的方式实现添加类实例方法,有时候也可以混合使用。另外使用代理类的好处在于多个类都需要相同方法的时候可以定义共同的部分,举一个发邮件的例子:

class A<ActiveRecord::Base
    include SendEmail
end

class B<ActiveRecord::Base
    include SendEmail
end
</div>

实现引入模块:
module SendEmail
    #include this module to class::A and B
    #use like that--  A.first.send_email
    def send_email
      Email.call_email(self)
    end
end
</div>

实现代理类:

class Email < ActionMailer::Base
  default :from => "test@email.com"

  def self.call_email(obj)

您可能想查找下面的文章:

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

相关文章

  • Ruby基础知识之数据类型
  • Ruby中的循环语句的用法教程
  • 浅谈Ruby on Rails的国际化
  • ruby声明式语法的实现例子
  • 用SparkR探索电商数据
  • 设计模式中的观察者模式在Ruby编程中的运用实例解析
  • win7安装ruby on rails开发环境
  • Ruby中的Range对象学习笔记
  • Windows下安装配置Ruby的debug工具ruby-debug-base19
  • ruby 学习笔记(1) 初识语法

文章分类

  • vbs
  • DOS/BAT
  • hta/htc
  • python
  • perl
  • VBA
  • ColdFusion
  • ruby
  • PowerShell
  • Lua
  • Golang
  • linux shell

最近更新的内容

    • 利用RJB在Ruby on Rails中使用Java代码的教程
    • Ruby简洁学习笔记(二):类继承、属性、类变量
    • Ruby使用设计模式中的代理模式与装饰模式的代码实例
    • 采用UTF-8解决Ruby on Rails程序的中问题
    • Rails link_to 详解
    • RUBY文档中心-学习开始
    • Ruby常量查找路径问题深入研究
    • 简单对比分析Ruby on Rails 和 Laravel
    • Ruby字符串、条件、循环、数组、Hash、类基本操作笔记
    • Ruby实现的合并排序算法

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有