ruby中的实例方法、类方法、单体方法、私有方法、protected方法

1、ruby中的实例方法和Java等其他语言的定义类似
class Dog
   def run
   puts "I'm running!"
   end
end
 
   dog = Dog.new
   dog.run #I'm running!

2、类方法定义时需要在方法名前加入类名称或者self关键字
class Dog
   def Dog.species    #或者 def self.species
    puts "I belong to the canine"
 end
end
Dog.species #I belong to the canine

注意:在ruby中类方法只能被类对象调用,不能被实例对象调用。在这里就是指:species方法只能这样调用Dog.species,而不能这样调用Dog.new.species。这与Java中不同(Java中类只能调用类方法,而实例既可以调用实例方法,也可以调用类方法)
3、单体方法只在该对象上起作用
dog1 = Dog.new
def dog1.speak
    puts "I'm talking"
end
dog1.speak#I'm talking
dog2 = Dog.new
dog2.speak
#NoMethodError: undefined method `speak' for #<Dog:0x7fabbbedfc88 @name="Dog">
        from (irb):78
        from :0
4、和Java一样,用private标识私有方法。但ruby中的私有方法可以在子类中调用(Java中只允许在本类内部调用)。位于private之后的方法都会被认为是私有方法。
class Demo
   def pub_method
    puts "I'm public method"
    puts "invoke private method in internal"
    pri_method
  end
  private
  def pri_method
     puts "I'm private method"
   end
end
demo = Demo.new
#demo.pub_method
#I'm public method
#invoke private method in internal
#I'm private method
demo.pri_method
NoMethodError: private method `pri_method' called for #<Demo:0x7f2e7edf7650>
        from (irb):14
        from :0
class SubDemo < Demo
   def pub_method
     puts "invoke parent class private method"
     pri_method
  end
end
=> nil
subDemo = SubDemo.new
subDemo.pub_method
invoke parent class private method
I'm private method
=> nil
5、protected方法
尽管ruby中子类可以调用父类中的私有方法,但是在子类中仍然不能通过外部对象调用。只有protected和public方法才能被外部对象调用。
class SubDemo < Demo
   def pri_pro_diff(other)
   pri_method
    other.pri_method
end
irb(main):032:1> end
=> nil
subDemo1 = SubDemo.new
subDemo2 = SubDemo.new
subDemo1.pri_pro_diff(subDemo2)
I'm private method
NoMethodError: private method `pri_method' called for #<SubDemo:0x7f4fb2bb5338>
        from (irb):30:in `pri_pro_diff'
        from (irb):35
        from :0
说明:可以看出在子类内部是可以调用父类的私有方法,但在子类内部仍然不能通过外部对象调用私有方法。
下面是将私有方法转换成protected方法的情况

class Demo
   protected :pri_method
end
=> Demo
subDemo1.pri_pro_diff(subDemo2)
I'm private method
I'm private method
=> nil

转载于:https://www.cnblogs.com/Adolph-yao/p/3436371.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值