前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Ruby高级技术】对面向对象里的控制访问,包括类的继承类常量的深入理解和使用

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

作者头像
上进小菜猪
发布2022-12-20 08:31:11
6170
发布2022-12-20 08:31:11
举报

文章目录

面向对象

代码语言:javascript
复制
class Box
   def initialize(w,h)
      @width, @height = w, h
   end
end

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

代码语言:javascript
复制
class Box
   code
end

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

代码语言:javascript
复制
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方法始终是私有的。 私有方法:不能从类外部访问或查看私有方法。只有类方法才能访问私有成员。 受保护方法:受保护方法只能由类及其子类的对象调用。只能在类及其子类中进行访问。 下面是一个简单的示例,演示这三个修饰符的语法:

代码语言:javascript
复制
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的子类:

代码语言:javascript
复制
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,

代码语言:javascript
复制
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在不同的上下文中具有不同的含义。 这意味着可以通过将类作为当前对象来执行类定义。这也意味着元类和父类中的方法在方法定义的执行过程中可用。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-12-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 面向对象
  • 控制访问
  • 类的继承
  • 类常量
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档