Ruby 类的继承+重载+冻结对象

2017-09-28  本文已影响61人  changsanjiang
#!/usr/bin/ruby
# -*- coding: UTF-8 -*-


# 类的继承
    # => 继承允许我们根据另一个类来定义一个类, 这样使得创建和维护应用程序变得更加容易. 
    # => 继承有助于重用代码和快速执行. 但 Ruby 不支持多继承, 但是 Ruby 支持 mixins. mixin 就像是多继承的一个特定实现, 在多继承中, 只有接口部分是可继承的. 
    # => 当创建类时, 我们可以直接指定新类继承自某个已有类的成员, 这样就不用从头编写新的数据成员和成员函数. 这个已有类被称为基类或父类, 新类被称为派生类或子类.

#定义父类
#class Box
#   attr_accessor :width, :height
#
#   # 构造器方法
#   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(12, 20)
#box.printArea

# 方法重载
    # => 虽然我们可以在派生类中添加新的功能, 但有时我们可能想要改变已经在父类中定义的方法的行为. 
    # => 这时, 我们可以保持方法名不变, 重载这个方法的功能即可. 
#class Box
#   attr_accessor :width, :height
#   def initialize(w, h)
#       @width, @height = w, h
#   end
#
#
#   def getArea
#       @width * @height
#   end
#end    

#class BigBox < Box
#   # 重载
#   def getArea
#       @area = @width * @height
#       puts "Big box area is : #{@area}"
#   end
#end

#box = BigBox.new(10, 20)
#box.getArea

# 运算符重载
    # => 我们希望使用 + 运算符执行两个 Box 对的向量加法, 使用 * 运算符来把 Box 的 width 和 height 相乘, 使得一元运算符 - 对 Box 的 width 和 height 对方. 
    # => 下面是一个带有数学运算符定义的 Box 类版本:
#class Box 
#   def initialize(w, h)
#       @widht, @height = w, h
#   end
#
#   def +(other)
#       Box.new(@width + other.width, @height + other.height)
#   end
#
#   def -@
#       Box.new(-@widht, -@height)
#   end
#
#   def *(scalar)
#       Box.new(@width * scalar, @height * scalar)
#   end
#end



# 冻结对象
    # => 有时候, 我们想要防止对象被改变. 在 Object 中, freeze 方法可实现这点, 他能有效地把一个对象变成一个常量. 任何对象都可以通过调用 Object.freeze 进行冻结. 
    # => 冻结对象不能被修改, 也就是说, 我们不能改变他的实例变量.
    # => 我们可以使用 Object.frozen? 方法检查一个给定的对象是否已经被冻结. 如果对象已被冻结, 该方法将返回 true, 否则返回一个 false 值. 

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

#box = Box.new(10, 20)

#box.freeze

#if ( box.frozen? ) 
#   puts "Box object is frozen object"
#else
#   puts "Box object is normal object"
#end

#box.width = 100


上一篇 下一篇

猜你喜欢

热点阅读