Ruby中關於類以及繼承的一些知識點

class Point
  VERSION = 2
  @@num = 12
  attr_accessor :x, :y
  def initialize(x, y)
    @x, @y = x, y
  end

  # 1 返回布爾值的方法末位必定要加上?
  # 2 此處的x 與 y 是self.x 的省略寫法, 由於有get 方法因此才能夠這麼寫
  # 固然也能夠@x @y 這樣的寫法
  def first_quadrant?
    x > 0 && y > 0
  end

  # 3 可是在給局部變量賦值的時候必定不能簡寫成 x +=
  def plus(a, b)
    self.x += a
    @y += b
  end

  # 4 符號方法
  # 5 會自動將最後處理出來的結果return出去 此處省略return
  # 6 此處的x 和 y 就是省略了self.x 或者@x 這種寫法
  def +(p2)
    Point.new(@x + p2.x, @y + p2.y)
  end

  # 7 此處x 前面不能加self 此處的self指的是類
  def self.second_quadrant?(x , y)
    x < 0 && y > 0
    # self指代的是類
    # print self.xxxx
  end

  # 8 類方法能夠合併成多個寫法
  class << self
    def foo2
    end
    def bar2
    end
  end

end

# 9 實例沒法調用類方法
# 10 類也沒法直接調用實例方法

class Point
  # 9 經過類直接調用全局變量 須要給類加一個方法
  # 10 在ruby中能夠直接打開類增長你須要的東西
  def self.get_num
    @@num
  end
end

# 11 調用常量
# Point::VERSION

# 12 繼承
class Point3D < Point
  # 13 super調用父類的同名方法
  def initialize(x, y, z)
    super(x, y)
    @z = z
  end
end

class Point2D < Point
  # 14 super若是不寫參數的話 默認傳入全部的參數給super
  def initialize(x, y)
    super
  end
end

# 15 在Ruby中子類能夠繼承父類的全部方法 無論是private protected public
# 在Ruby子類能夠重寫如 父類的private 方法但不建議這麼作
# 繼承最好使用protected 和 public 方法
class Point
  def prv_method
    print 'this is private method'
  end

  private :prv_method

  def pro_metod
    print 'this is protected method'
  end

  protected :pro_metod

  def wat
    prv_method
    pro_metod
  end

  def wut
    # 16 private 方法和 protected最大的區別 private方法不能使用實例調用
    # 只能隱式調用 因此self.prv_method 方法是錯誤的
    # self.prv_method
    self.pro_metod
  end
end

# 17 is_a? 和 instance_of 的區別
p3 = Point3D.new(1, 2, 3)

# 18 is_a? 只要是這個類的實例或者是子類的實例均可
p p3.is_a?(Point)
p p3.instance_of?(Point3D)

# 19 instance_of? 只能是這個類的實例才能夠
p p3.instance_of?(Point)
p p3.instance_of?(Point3D)

# 20 = - p3等於上個計算式的結果
# p1 = Point(2, 3)
# p2 = Point(3, 4)
# p1 + p2
# p3 = -
相關文章
相關標籤/搜索