【Ruby高级技术】对面向对象里的控制访问,包括类的继承类常量的深入理解和使用

简介: 【Ruby高级技术】对面向对象里的控制访问,包括类的继承类常量的深入理解和使用

@[toc]

面向对象

class Box
   def initialize(w,h)
      @width, @height = w, h
   end
end

类用于指定对象的形式。它结合了数据表示和方法,将数据组织成一个整洁的包。类中的数据和方法称为类的成员。
Ruby类定义
定义类时,实际上定义了数据类型的蓝图。这实际上并没有定义任何数据,而是定义了类的名称意味着什么,即类的对象将由什么组成,以及可以对对象执行什么操作。
类定义以关键字class开头,后跟类名,以结尾结尾。例如,我们使用关键字类来定义Box类,如下所示:

class Box
   code
end

实例变量是类属性,当使用类创建对象时,这些属性将成为对象的属性。每个对象的属性是单独指定的,不会与其他对象共享值。@operator用于访问类内部的这些属性,而名为accessor方法的公共方法用于访问类外部的这些属性。让我们将上面定义的类Box作为实例,并将@width和@height作为类Box的实例变量。

class Box
   def initialize(w,h)
      @width, @height = w, h
   end
 
   def printWidth
      @width
   end
 
   def printHeight
      @height
   end
end
box = Box.new(10, 20)
 

x = box.printWidth()
y = box.printHeight()
 
puts "盒子宽度 : #{x}"
puts "盒子高度 : #{y}"

创建对象,初始化盒子的高度与宽度。

控制访问

Ruby为提供了三个级别的实例方法保护:公共、私有或受保护。Ruby不对实例和类变量应用任何访问控制。
公共方法:任何对象都可以调用公共方法。默认情况下,方法是公共的,但initialize方法始终是私有的。
私有方法:不能从类外部访问或查看私有方法。只有类方法才能访问私有成员。
受保护方法:受保护方法只能由类及其子类的对象调用。只能在类及其子类中进行访问。
下面是一个简单的示例,演示这三个修饰符的语法:

Area of the box is : 200
test.rb:42: protected method `printArea' called for #
<Box:0xb7f11280 @height=20, @width=10> (NoMethodError)

类的继承

继承是面向对象编程中最重要的概念之一。继承允许我们基于另一个类定义一个类,这使得创建和维护应用程序更加容易。
继承有助于重用代码并快速执行。不幸的是,Ruby不支持多重继承,但Ruby支持混合。mixin类似于多重继承的特定实现。在多重继承中,只有接口部分是可继承的。
在创建类时,程序员可以直接指定新类继承自现有类的成员,这样就不必从头开始编写新的数据成员和成员函数。现有类称为基类或父类,新类称为派生类或子类。
Ruby还提供了子类化的概念,这意味着继承。下面的示例解释了这个概念。扩展类的语法非常简单。只需在class语句中添加<字符和父类的名称。例如,以下定义BigBox类是Box的子类:

class Box
   def initialize(w,h)
      @width, @height = w, h
   end
   def getArea
      @width * @height
   end
end

class BigBox < Box
   def printArea
      @area = @width * @height
      puts "Big box area is : #@area"
   end
end
box = BigBox.new(10, 20)
box.printArea()

有时我们想防止对象被更改。在Object中,冻结方法可以实现这一点。它可以有效地将对象转换为常量。任何对象都可以调用对象冻结。不能修改冻结对象,即不能更改其实例变量。
可以使用对象冻结?方法检查给定对象是否已冻结。如果对象已被冻结,则此方法将返回true;否则,它将返回一个假值。

类常量

通过将直接数值或字符串值赋给变量,可以在类中定义常量。不需要使用@或@@来定义常量。按照惯例,常数的名称是大写的。
一旦定义了常量,就不能更改其值。可以直接访问类内的常量,就像访问变量一样。但如果要访问类外部的常量,则必须使用类名::constant,

class Box
   BOX_COMPANY = "TATA Inc"
   BOXWEIGHT = 10
   def initialize(w,h)
      @width, @height = w, h
   end
   # 实例方法
   def getArea
      @width * @height
   end
end
box = Box.new(10, 20)
a = box.getArea()
puts "Area of the box is : #{a}"
puts Box::BOX_COMPANY
puts "Box weight is: #{Box::BOXWEIGHT}"

Ruby的自我与Java的this相似,但却截然不同。Java方法在实例方法中被引用,因此这通常指向当前对象。Ruby代码逐行执行,因此self在不同的上下文中具有不同的含义。
这意味着可以通过将类作为当前对象来执行类定义。这也意味着元类和父类中的方法在方法定义的执行过程中可用。

相关文章
|
7月前
|
程序员 Ruby
|
7月前
|
程序员 Ruby
|
4月前
|
前端开发 测试技术 数据库
使用Ruby on Rails进行快速Web开发的技术探索
【8月更文挑战第12天】Ruby on Rails以其高效、灵活和易于维护的特点,成为了快速Web开发领域的佼佼者。通过遵循Rails的约定和最佳实践,开发者可以更加专注于业务逻辑的实现,快速构建出高质量的Web应用。当然,正如任何技术框架一样,Rails也有其适用场景和局限性,开发者需要根据项目需求和个人偏好做出合适的选择。
|
4月前
|
开发者 编解码
界面适应奥秘:从自适应布局到图片管理,Xamarin响应式设计全解析
【8月更文挑战第31天】在 Xamarin 的世界里,构建灵活且适应性强的界面是每位开发者的必修课。本文将带您探索 Xamarin 的响应式设计技巧,包括自适应布局、设备服务协商和高效图片管理,帮助您的应用在各种设备上表现出色。通过 Grid 和 StackLayout 实现弹性空间分配,利用 Device 类检测设备类型以加载最优布局,以及使用 Image 控件自动选择合适图片资源,让您轻松应对不同屏幕尺寸的挑战。掌握这些技巧,让您的应用在多变的市场中持续领先。
45 0
|
4月前
|
开发者 测试技术 Android开发
Xamarin 开发者的五大常见问题及解决方案:从环境搭建到性能优化,全面解析高效跨平台应用开发的技巧与代码实例
【8月更文挑战第31天】Xamarin 开发者常遇问题及解决方案覆盖环境搭建至应用发布全流程,助新手克服技术难关。首先需正确安装配置 Visual Studio 及 Xamarin 支持,设置 iOS/Android 测试环境。利用 Xamarin.Forms 和 XAML 实现高效跨平台开发,共享 UI 和业务逻辑代码。针对性能优化,采取减少 UI 更新、缓存计算结果等措施,复杂问题则借助 Xamarin Profiler 分析。
61 0
|
5月前
|
数据采集 存储 XML
Ruby爬虫技术:深度解析Zhihu网页结构
Ruby爬虫技术:深度解析Zhihu网页结构
|
7月前
|
Ruby
|
7月前
|
Ruby
|
7月前
|
Ruby
|
7月前
|
Java Ruby