【Ruby高级技术】对面向对象里的控制访问,包括类的继承类常量的深入理解和使用
文章目录
面向对象
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在不同的上下文中具有不同的含义。 这意味着可以通过将类作为当前对象来执行类定义。这也意味着元类和父类中的方法在方法定义的执行过程中可用。
相关文章
- 统一、灵活、全面,这个好用的语义分割开源库全面升级啦
- MySQL事务还能这么理解?这回我知道怎么应付面试官了
- MMPose 1.0:优雅而强大的姿态估计算法框架
- 模型压缩库 MMRazor 全面升级,更灵活、自动
- MMRotate 全面升级,新增 BoxType 设计
- Java里面 根据一个字符串 计算他的hash 值(工具类)md5散列的方式计算hash值
- 【面试】揭秘面试背后的那点真实
- 【网络层】流量控制VS拥塞控制、路由器功能、SDN控制平面
- 【网络层】IP组播(多播)、硬件组播、IGMP、组播路由选择协议、移动IP、路由器详解、路由表和路由转发
- 技术硬实力,你应该这样和面试官聊Dubbo
- 技术硬实力,这样去面试你肯定会过
- 为什么阿里巴巴会这么重视技术面试呢?
- 广和通重磅发布最新5G Sub-6及毫米波模组FX170(W)!
- 学习ASP.NET Core Blazor编程系列二十二——登录(1)
- 学习ASP.NET Core Blazor编程系列二十一——数据刷新
- 学习ASP.NET Core Blazor编程系列二十——文件上传(完)
- 学习ASP.NET Core Blazor编程系列十九——文件上传(下)
- 学习ASP.NET Core Blazor编程系列十八——文件上传(中)
- 学习ASP.NET Core Blazor编程系列十七——文件上传(上)
- 学习ASP.NET Core Blazor编程系列十六——排序