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
    

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

  • 相关阅读:
    跨浏览器的事件处理程序
    开发技术文档汇总
    JVM知识树
    JDK1.8新特性(一)
    CAS
    Redis集群之修改节点IP
    阿里云服务器 发送邮箱 STMP 25端口 465端口问题 Javamail 25被禁用
    日志log4j到Logback的使用(主要是Logback)
    ThreadLocal原理和 java类全局静态变量在多线程中数据混乱问题
    SpringMVC拦截器拦截页面(坑)
  • 原文地址:https://www.cnblogs.com/Stay-J/p/9607196.html
Copyright © 2011-2022 走看看