• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Ruby类的继承

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

Ruby继承的语法

class DerivedClass < BaseClass
    #some stuff
end

 < 为继承符号

重写(override) 的概念

有时, 我们希望子类从父类继承来的方法可以做与父类不相同的事情,这就需要在子类中重写方法。例如, 你有一个类名字叫Email继承于类Message,两个类都有send方法,但是Email类的send方法需要有邮件地址和一系列邮件协议,但是Message中的send方法并不知道这些,与其在Email类中添加send_mail方法,而从父类继承的send方法弃之不用, 不如显式的修改send方法以适应Email的需求。

例如:

class Creature
  def initialize(name)
    @name = name
  end
  
  def fight
    return "Punch to the chops!"
  end
end

# Add your code below!
class Dragon < Creature
    def fight
        return "Breathes fire!"
    end
end
    
dragon = Dragon.new("dragon")
dragon.fight
--------------------------------------------------
输出:
"Breathes fire!"

 

另一方面, 有时子类发现它所需要的继承自父类的方法已经被改写, 不要惊慌, 我们可以直接获取父类的响应方法, 这需要使用super关键字。

语法为:

class DerivedClass < Base
  def some_method
    super(optional args)
      # Some stuff
    end
  end
end

当你在方法中调用super, 这就是告诉Ruby,在父类中找到与调用super的这个方法同名的函数,如果找到, 那么Ruby将会使用其父类版本的这个方法。

例如:

class Creature
  def initialize(name)
    @name = name
  end
  
  def fight
    return "Punch to the chops!"
  end
end

# Add your code below!
class Dragon < Creature
    def fight
        puts "Instead of breathing fire..."
        super
    end
end
    
dragon = Dragon.new("w")
dragon.fight
-------------------------------------------------------------------
输出:
Instead of breathing fire...
"Punch to the chops!"

 

Ruby不支持多继承。然而Ruby允许使用mixin, 这个我们稍后再讲。

 

为了程序的安全性, Ruby允许我们显式地对方法进行public或private声明, public方法允许作为接口被调用,private方法则对外界不可见。如果不写public或private,Ruby默认为public。

 1 class Person
 2   def initialize(name, age)
 3     @name = name
 4     @age = age
 5   end
 6   
 7   public    # This method can be called from outside the class.
 8   
 9   def about_me
10     puts "I'm #{@name} and I'm #{@age} years old!"
11   end
12   
13   private   # This method can't!
14   
15   def bank_account_number
16     @account_number = 12345
17     puts "My bank account number is #{@account_number}."
18   end
19 end
20 
21 eric = Person.new("Eric", 26)
22 eric.about_me
23 eric.bank_account_number  #错误, 调用了私有方法!
 -------------------------------------------------------------------------
 输出:
 I'm Eric and I'm 26 years old!
 private method `bank_account_number' called for #<Context::Person:0x0000000262d930 @name="Eric", @age=26>

 

用attr_reader, attr_writer读写属性(attribute)

根据前面我们所学,如果想要访问定义在类中的属性,例如,我们想要访问@name实例变量, 我们必须这么写

def name
  @name
end

如果我们想要我们想修改@name实例变量,那么我们要这么写:

def name=(value)
  @name = value
end

现在不必这么麻烦了。我们可以用attr_reader和attr_writer来读写变量,如下:

class Person
  attr_reader :name
  attr_writer :name
  def initialize(name)
    @name = name
  end
end

当遇到上面的代码时,Ruby自动地做类似如下的事情:

def name
  @name
end

def name=(value)
  @name = value
end

像变魔术一样, 我们可以随意读写变量了!我们仅仅是把变量(转换为symbol)传给attr_reader和attr_writer

如果你既想read也想write一个变量, 那么还有比使用attr_reader和attr_writer更加简短的办法, 那就是用attr_accessor.

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
3分钟轻松搭建Ruby项目自动化持续集成发布时间:2022-07-14
下一篇:
ruby 安装 运行发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap