Ruby中类的进阶(继承,private, public, protect)

类中的public,protect,private

public method

class Point
    def test
    end
end

这样定义的test方法就是一个public方法可以在类内外使用

protected method

protected
protected 权限的函数只能在被本类或子类的上下文中调用,单可以使用other_object.function的形式。这个关键是可以调用本类的其他对象的protected函数

class Point
    def test
    end
    protected :test
end

或者

class Point
    protected
    def test
    end
end

实例:

 # Now make 'test' protect

  class B 
      protected    :test_access 
  end

  p A.new.test_access            # 错误 private method 'test_access' 
  B.new.test                          # test access right

  p B.new.test_other(B.new)   # test access right

  p B.new.test_other(A.new)  # 错误 private method 'test_access'

只要在protected关键词之后那么就是protected

private

只能在本对象的实例中访问本对象的private方法,Ruby中private意为不能指定方法接收者,接收者只能是self,且self必须省略;

private权限的函数只能在本对象成员函数中访问到。也就是这个函数只是对这个对象的实现细节。

class A
    private
    def test_access
        @instance_attribute = "instance_attribute"
        return "test access right"
    end
end

class B < A
    def test
        puts test_access
        puts @instance_attribute
    end
    
    def test_other(a)
        a.test.access
    end
end

-------------------------
B.new.test       # => test access right
# = > instance_attribute

A.new.test_access #错误test.rb:20: private method `test_access' called for #<A:0x3fd9064> (NoMethodError)
B.new.test_other(A.new) #错误test.rb:18: in `test_other': private method `test_access' called for #<A:0x4198850> (NoMethodError) from test.rb:24

基本继承

直接进入主题吧,我们先定义一个类

class Point
    def initialize(x, y)
        # @x instance variable
        # @@x class variable
        # $x global variable
        # x local variable
        @x, @y = x, y
    end
    
    def first_quadrant?
        x > 0 && y >0
    end
end

这里我们创建一个新的类继承原来的类

class Point3D << Point
    def initialize(x, y, z)
       @x, @y, @z = x, y, z
    end
end

但是我们可以使用super方法

class Point3D << Point
    def initialize(x, y, z)
      super(x, y)
      @z = z
    end
end

继承了父类中的方法,不用写重复的代码了

原文地址:https://www.cnblogs.com/Stay-J/p/9607196.html