zoukankan      html  css  js  c++  java
  • 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
    

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

  • 相关阅读:
    字符串:序列自动机
    图论学习——最大团与最大独立集
    点分治
    图论:Johnson全源最短路
    停止更新博客
    将Eclipse中现有的java类生成类图
    problem:SVN error: (501 Not Implemented)
    SVN 修改URL路径
    eclipse中,把java函数代码折叠/展开
    Build类
  • 原文地址:https://www.cnblogs.com/Stay-J/p/9607196.html
Copyright © 2011-2022 走看看