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

2022-12-20 08:31:11 浏览数 (1)

文章目录
  • 面向对象
  • 控制访问
  • 类的继承
  • 类常量

面向对象

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

0 人点赞