婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > Ruby面向對象編程詳解

Ruby面向對象編程詳解

熱門標簽:天津外呼系統怎么收費 巫師3地圖標注魔力之所 AI電銷機器人 線路 外呼線路從哪里出來的 征服者企業地圖標注 柯城手機地圖如何做地圖標注 中牟外呼系統違法嗎 淮安自動外呼系統供應商 漯河電銷

Ruby是純面向對象的語言,所有項目似乎要Ruby中為一個對象。Ruby中的每個值是一個對象,即使是最原始的東西:字符串,數字甚至true和false。即使是一個類本身是一個對象,它是Class類的一個實例。本章將通過所有功能涉及到Ruby的面向對象。

類是用來指定對象的形式,它結合了數據表示和方法操縱這些數據,轉換成一個整齊的包。在一個類的數據和方法,被稱為類的成員。

Ruby類的定義:

定義一個類,定義的數據類型的草圖。 這實際上并不定義任何數據,但它定義的類名字的意思什么,即是什么類的對象將包括這樣一個對象上執行什么操作可以。

類定義開始與關鍵字class類名和 end 分隔。例如,我們定義Box類使用class關鍵字如下:

復制代碼 代碼如下:

class Box
   code
end

名稱必須以大寫字母開始,按照約定名稱中包含多個單詞,每個單詞沒有分隔符(駝峰式)一起執行。

定義Ruby的對象:

類為對象的藍圖,所以基本上是一個從一個類對象被創建。我們聲明一個類的對象使用new關鍵字。下面的語句聲明了兩個對象,Box 類:

復制代碼 代碼如下:

box1 = Box.new
box2 = Box.new

initialize方法:

initialize方法是一個標準的Ruby類的方法,和其它面向對象編程語言的構造方法有相同的方式工作。 initialize方法是有用的,在創建對象的時候,一些類變量初始化。這種方法可能需要的參數列表,它像其他Ruby之前的方法用def關鍵字定義,如下所示:

復制代碼 代碼如下:

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

實例變量:

實例變量是類的一種屬性,一旦我們使用的類對象被創建的對象的屬性。每個對象的屬性被分別賦值的并與其它對象共享,它們在類的內部使用@操作符訪問,但訪問類之外的,我們使用的公共方法被稱為訪問器方法。如果我們把上述定義的類 Box,然后 @width 和 @height 類 Box實例變量。

復制代碼 代碼如下:

class Box
   def initialize(w,h)
      # assign instance avriables
      @width, @height = w, h
   end
end

訪問器和setter方法​​:

為了外部能訪問類的變量,它們必須定義存取器方法,這些存取器方法也被稱為getter方法。下面的例子演示了如何使用訪問器方法:

復制代碼 代碼如下:

#!/usr/bin/ruby -w

# define a class
class Box
   # constructor method
   def initialize(w,h)
      @width, @height = w, h
   end

   # accessor methods
   def printWidth
      @width
   end

   def printHeight
      @height
   end
end

# create an object
box = Box.new(10, 20)

# use accessor methods
x = box.printWidth()
y = box.printHeight()

puts "Width of the box is : #{x}"
puts "Height of the box is : #{y}"


當上面的代碼執行時,它會產生以下結果:
復制代碼 代碼如下:

Width of the box is : 10
Height of the box is : 20

類似的存取方法用于訪問的變量值,Ruby提供了一種方法來從類的外部設置這些變量的值,那就是setter方法​​,定義如下:
復制代碼 代碼如下:

#!/usr/bin/ruby -w

# define a class
class Box
   # constructor method
   def initialize(w,h)
      @width, @height = w, h
   end

   # accessor methods
   def getWidth
      @width
   end
   def getHeight
      @height
   end

   # setter methods
   def setWidth=(value)
      @width = value
   end
   def setHeight=(value)
      @height = value
   end
end

# create an object
box = Box.new(10, 20)

# use setter methods
box.setWidth = 30
box.setHeight = 50

# use accessor methods
x = box.getWidth()
y = box.getHeight()

puts "Width of the box is : #{x}"
puts "Height of the box is : #{y}"


當上面的代碼執行時,它會產生以下結果:
復制代碼 代碼如下:

Width of the box is : 30
Height of the box is : 50

實例方法:

也以同樣的方式,因為我們使用def關鍵字定義其他方法,并按下圖所示僅對使用一個類的實例,它們可以被用來定義該實例方法。它們的功能不局限于訪問實例變量,他們也可以按要求做更多的事情。

復制代碼 代碼如下:

#!/usr/bin/ruby -w

# define a class
class Box
   # constructor method
   def initialize(w,h)
      @width, @height = w, h
   end
   # instance method
   def getArea
      @width * @height
   end
end

# create an object
box = Box.new(10, 20)

# call instance methods
a = box.getArea()
puts "Area of the box is : #{a}"


當上面的代碼執行時,它會產生以下結果:
復制代碼 代碼如下:

Area of the box is : 200

類的方法和變量:

類變量是一個變量,這是一個類的所有實例之間共享。該變量是一個實例,它是可訪問對象實例。兩個@字符類變量帶有前綴(@@)。在類定義類變量必須初始化,如下所示。

類方法的定義使用:def self.methodname() 以 end 字符結束,將被稱為使用classname.methodname類名,在下面的例子所示:

復制代碼 代碼如下:

#!/usr/bin/ruby -w

class Box
   # Initialize our class variables
   @@count = 0
   def initialize(w,h)
      # assign instance avriables
      @width, @height = w, h

      @@count += 1
   end

   def self.printCount()
      puts "Box count is : #@@count"
   end
end

# create two object
box1 = Box.new(10, 20)
box2 = Box.new(30, 100)

# call class method to print box count
Box.printCount()


當上面的代碼執行時,它會產生以下結果:
復制代碼 代碼如下:

Box count is : 2

to_s 方法:

所定義的任何類的實例應該有一個 to_s 方法返回一個字符串形式表示對象。下面以一個簡單的例子來表示一個Box對象,在寬度和高度方面:

復制代碼 代碼如下:

#!/usr/bin/ruby -w

class Box
   # constructor method
   def initialize(w,h)
      @width, @height = w, h
   end
   # define to_s method
   def to_s
      "(w:#@width,h:#@height)"  # string formatting of the object.
   end
end

# create an object
box = Box.new(10, 20)

# to_s method will be called in reference of string automatically.
puts "String representation of box is : #{box}"


當上面的代碼執行時,它會產生以下結果:
復制代碼 代碼如下:

String representation of box is : (w:10,h:20)

訪問控制:

Ruby提供了三個級別的保護實例方法的級別:public, private 和 protected。 Ruby沒有應用實例和類變量的任何訪問控制權。

Public Methods: 任何人都可以被稱為public方法。方法默認為公用初始化,這始終是 private 除外。 .

Private Methods: private方法不能被訪問,或者甚至從類的外部瀏覽。只有類方法可以訪問私有成員。

Protected Methods: 受保護的方法可以被調用,只能通過定義類及其子類的對象。訪問保存在類內部。

以下是一個簡單的例子來說明三個訪問修飾符的語法:

復制代碼 代碼如下:

#!/usr/bin/ruby -w

# define a class
class Box
   # constructor method
   def initialize(w,h)
      @width, @height = w, h
   end

   # instance method by default it is public
   def getArea
      getWidth() * getHeight
   end

   # define private accessor methods
   def getWidth
      @width
   end
   def getHeight
      @height
   end
   # make them private
   private :getWidth, :getHeight

   # instance method to print area
   def printArea
      @area = getWidth() * getHeight
      puts "Big box area is : #@area"
   end
   # make it protected
   protected :printArea
end

# create an object
box = Box.new(10, 20)

# call instance methods
a = box.getArea()
puts "Area of the box is : #{a}"

# try to call protected or methods
box.printArea()


當上面的代碼被執行時,產生下面的結果。在這里,第一種方法被調用成功,但第二種方法給一個提示。
復制代碼 代碼如下:

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也支持繼承。繼承和下面的例子解釋了這個概念。擴展類的語法很簡單。只需添加一個字符的超類聲明的名稱。例如,定義Box類的子類classBigBox:

復制代碼 代碼如下:

#!/usr/bin/ruby -w

# define a class
class Box
   # constructor method
   def initialize(w,h)
      @width, @height = w, h
   end
   # instance method
   def getArea
      @width * @height
   end
end

# define a subclass
class BigBox Box

   # add a new instance method
   def printArea
      @area = @width * @height
      puts "Big box area is : #@area"
   end
end

# create an object
box = BigBox.new(10, 20)

# print the area
box.printArea()


當上面的代碼執行時,它會產生以下結果:
復制代碼 代碼如下:

Big box area is : 200

方法重載:

雖然可以在派生類中添加新的函數,但有時想改變的行為已經在父類中定義的方法。只需通過保持相同的方法名和重寫該方法的功能,如下圖所示,在這個例子可以這樣做:

復制代碼 代碼如下:

#!/usr/bin/ruby -w

# define a class
class Box
   # constructor method
   def initialize(w,h)
      @width, @height = w, h
   end
   # instance method
   def getArea
      @width * @height
   end
end

# define a subclass
class BigBox Box

   # change existing getArea method as follows
   def getArea
      @area = @width * @height
      puts "Big box area is : #@area"
   end
end

# create an object
box = BigBox.new(10, 20)

# print the area using overriden method.
box.getArea()

運算符重載:

我們想“+”運算符使用+,*操作由一個標量乘以一箱的寬度和高度,這里是一個版Box類的定義及數學運算符:

復制代碼 代碼如下:

class Box
  def initialize(w,h) # Initialize the width and height
    @width,@height = w, h
  end

  def +(other)         # Define + to do vector addition
    Box.new(@width + other.width, @height + other.height)
  end

  def -@               # Define unary minus to negate width and height
    Box.new(-@width, -@height)
  end

  def *(scalar)        # To perform scalar multiplication
    Box.new(@width*scalar, @height*scalar)
  end
end

凍結對象:

有時候,我們要防止被改變的對象。凍結對象的方法可以讓我們做到這一點,有效地把一個對象到一個恒定。任何對象都可以被凍結通過調用Object.freeze。不得修改凍結對象:不能改變它的實例變量。

可以使用Object.frozen?語句檢查一個給定的對象是否已經被凍結,被凍結的情況下的對象語句方法返回true,否則返回false值。下面的示例 freeze 的概念:

復制代碼 代碼如下:

#!/usr/bin/ruby -w

# define a class
class Box
   # constructor method
   def initialize(w,h)
      @width, @height = w, h
   end

   # accessor methods
   def getWidth
      @width
   end
   def getHeight
      @height
   end

   # setter methods
   def setWidth=(value)
      @width = value
   end
   def setHeight=(value)
      @height = value
   end
end

# create an object
box = Box.new(10, 20)

# let us freez this object
box.freeze
if( box.frozen? )
   puts "Box object is frozen object"
else
   puts "Box object is normal object"
end

# now try using setter methods
box.setWidth = 30
box.setHeight = 50

# use accessor methods
x = box.getWidth()
y = box.getHeight()

puts "Width of the box is : #{x}"
puts "Height of the box is : #{y}"

當上面的代碼執行時,它會產生以下結果:

復制代碼 代碼如下:

Box object is frozen object
test.rb:20:in `setWidth=': can't modify frozen object (TypeError)
        from test.rb:39

類常量:

可以在類里定義分配一個直接的數字或字符串值,而不使用其定義一個變量為@@ 或 @。按照規范,我們保持常量名大寫。

一個常量一旦被定義就不能改變它的值,但可以在類里像常量一樣直接訪問,但如果要訪問一個類之外的常量,那么要使用類名::常量,所示在下面的例子。

復制代碼 代碼如下:

#!/usr/bin/ruby -w

# define a class
class Box
   BOX_COMPANY = "TATA Inc"
   BOXWEIGHT = 10
   # constructor method
   def initialize(w,h)
      @width, @height = w, h
   end
   # instance method
   def getArea
      @width * @height
   end
end

# create an object
box = Box.new(10, 20)

# call instance methods
a = box.getArea()
puts "Area of the box is : #{a}"
puts Box::BOX_COMPANY
puts "Box weight is: #{Box::BOXWEIGHT}"


當上面的代碼執行時,它會產生以下結果:
復制代碼 代碼如下:

Area of the box is : 200
TATA Inc
Box weight is: 10

類常量繼承和實例方法一樣,可以覆蓋。

創建對象使用分配:

當創建一個對象,而不調用它的構造函數初始化,即可能有一個情況:采用 new 方法,在這種情況下可以調用分配,這將創造一個未初始化的對象,看下面的例子:

復制代碼 代碼如下:

#!/usr/bin/ruby -w

# define a class
class Box
   attr_accessor :width, :height

   # constructor method
   def initialize(w,h)
      @width, @height = w, h
   end

   # instance method
   def getArea
      @width * @height
   end
end

# create an object using new
box1 = Box.new(10, 20)

# create another object using allocate
box2 = Box.allocate

# call instance method using box1
a = box1.getArea()
puts "Area of the box is : #{a}"

# call instance method using box2
a = box2.getArea()
puts "Area of the box is : #{a}"


當上面的代碼執行時,它會產生以下結果:
復制代碼 代碼如下:

Area of the box is : 200
test.rb:14: warning: instance variable @width not initialized
test.rb:14: warning: instance variable @height not initialized
test.rb:14:in `getArea': undefined method `*'
   for nil:NilClass (NoMethodError) from test.rb:29

類信息:

如果類定義的可執行代碼,這意味著他們在執行的上下文中一些對象:自身都必須引用的東西。讓我們來看看它是什么。

復制代碼 代碼如下:

#!/usr/bin/ruby -w

class Box
   # print class information
   puts "Type of self = #{self.type}"
   puts "Name of self = #{self.name}"
end


當上面的代碼執行時,它會產生以下結果:
復制代碼 代碼如下:

Type of self = Class
Name of self = Box

這意味著,一個類的定義,作為當前對象的類并執行。在元類和其超類的方法將在執行過程中使用的方法定義。

您可能感興趣的文章:
  • Ruby面向對象編程中類的方法與類的擴展
  • Ruby面向對象編程中類與方法的基礎學習
  • 簡要解讀Ruby面向對象編程中的作用域
  • Ruby的面向對象方式編程學習雜記
  • Ruby的面向對象編程的基礎教程
  • ruby 面向對象思維 概念
  • Ruby 面向對象知識總結

標簽:內江 甘孜 河池 棗莊 克拉瑪依 南昌 大慶 西雙版納

巨人網絡通訊聲明:本文標題《Ruby面向對象編程詳解》,本文關鍵詞  Ruby,面向,對象,編程,詳解,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Ruby面向對象編程詳解》相關的同類信息!
  • 本頁收集關于Ruby面向對象編程詳解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美亚一区二区| 不卡视频在线看| 久久噜噜亚洲综合| 国产精品亚洲视频| 成人av网址在线| 久久综合久久综合久久| 亚洲成人激情自拍| 国产精品99久久久久久似苏梦涵 | 欧美日韩一区二区三区在线看 | 亚洲乱码精品一二三四区日韩在线| 久草这里只有精品视频| 免费在线一区观看| 精品系列免费在线观看| 日韩欧美在线综合网| 亚洲最大成人综合| 国产午夜亚洲精品不卡| 99精品黄色片免费大全| 裸体健美xxxx欧美裸体表演| 亚洲成av人片| 欧洲精品视频在线观看| 亚洲女人的天堂| 国产精品自拍三区| 成人av资源下载| 蜜臀av一区二区| 欧美视频你懂的| 精品第一国产综合精品aⅴ| 亚洲一线二线三线视频| 亚洲高清在线精品| 日韩欧美高清在线| 国产精品久久久久久一区二区三区| 久久精品人人做人人综合| 欧美变态凌虐bdsm| 成av人片一区二区| 日韩美女视频一区| 成人国产电影网| 欧美日韩日本视频| 不卡电影免费在线播放一区| 国精产品一区一区三区mba桃花| 亚洲免费观看高清完整版在线观看熊 | 在线免费观看一区| 免费观看在线综合| 久久婷婷综合激情| 国产精品美女一区二区三区| 国产宾馆实践打屁股91| 国产69精品久久99不卡| 日本高清不卡一区| 极品少妇xxxx精品少妇| 久久精品噜噜噜成人88aⅴ| 日本三级亚洲精品| 亚洲精品一区二区在线观看| 99re成人在线| 国产精品三级视频| 欧美一a一片一级一片| 中文字幕乱码亚洲精品一区| 欧美日韩午夜在线视频| 亚洲精品免费播放| 亚洲乱码国产乱码精品精小说 | 在线视频你懂得一区二区三区| 精品一区二区三区视频在线观看 | www.成人在线| 99国产精品一区| 制服丝袜一区二区三区| 久久久久97国产精华液好用吗| 久久久久久久久伊人| 午夜欧美视频在线观看| 美女网站在线免费欧美精品| 韩国中文字幕2020精品| 欧美性感一类影片在线播放| 国产精品情趣视频| 国产高清不卡一区二区| 精品国产乱码91久久久久久网站| 国产精品久久久久久久久免费丝袜 | 欧美亚洲免费在线一区| 久久久高清一区二区三区| 亚洲精品视频观看| 成人听书哪个软件好| 欧美偷拍一区二区| 综合欧美亚洲日本| 成人av电影免费在线播放| 亚洲高清免费视频| 亚洲男人的天堂网| 波多野结衣亚洲| 成人国产精品免费观看视频| 国产自产v一区二区三区c| 日韩欧美激情四射| 夜夜嗨av一区二区三区| 中文字幕日韩一区| 国产色爱av资源综合区| www.日韩精品| 亚洲午夜日本在线观看| 欧美裸体一区二区三区| 久久久久久免费毛片精品| 国产日产亚洲精品系列| 日本视频免费一区| 日韩一级二级三级| 国产精品 欧美精品| 国产成人精品亚洲777人妖| 香港成人在线视频| 精品动漫一区二区三区在线观看| 欧美aⅴ一区二区三区视频| 日韩精品一区二区三区四区| 精品蜜桃在线看| 欧美一区二区三区在线视频| 国产欧美日韩另类视频免费观看| 麻豆精品国产传媒mv男同| 国产精品国产精品国产专区不蜜| 欧美电影精品一区二区| 91久久精品午夜一区二区| 亚洲激情中文1区| 国产精品每日更新| 国产91精品久久久久久久网曝门| 精品毛片乱码1区2区3区| 欧美日韩国产高清一区二区| 在线国产电影不卡| 99国产精品国产精品毛片| 久久99国产精品免费网站| 亚洲1区2区3区视频| 成人欧美一区二区三区白人 | 国产主播一区二区三区| 亚洲美女视频在线| 国产片一区二区三区| 欧美少妇xxx| 91麻豆精品国产| 26uuu另类欧美亚洲曰本| 国产午夜精品久久久久久免费视 | 91网址在线看| 91蜜桃在线免费视频| 成人性视频网站| 久草这里只有精品视频| 日韩欧美一区中文| 成人精品一区二区三区四区| 欧美成人一区二区三区| 国产视频一区二区在线| 热久久国产精品| 91亚洲精华国产精华精华液| 国产欧美日韩综合精品一区二区| 久久国产生活片100| 国产精品毛片大码女人| 久久免费看少妇高潮| 亚洲欧美另类图片小说| 国产精品久久久久久亚洲伦| 一区二区三区四区视频精品免费 | 久久99精品国产.久久久久久| 正在播放亚洲一区| 久久精品视频一区二区三区| 国产精品欧美一级免费| 1000部国产精品成人观看| 亚洲成人av免费| 国产成a人亚洲精| 欧美精品成人一区二区三区四区| 一区二区久久久久久| 国产喷白浆一区二区三区| 天天操天天干天天综合网| 国产揄拍国内精品对白| 在线不卡一区二区| 国产欧美综合色| 久久99热这里只有精品| 欧美乱妇15p| 亚洲成人一二三| 懂色中文一区二区在线播放| 日韩一区二区三区免费看| 午夜亚洲福利老司机| 欧美午夜精品一区二区三区| 亚洲三级在线观看| 国产在线精品免费av| 日韩欧美中文字幕制服| 自拍av一区二区三区| 在线日韩国产精品| 欧美另类一区二区三区| 色诱亚洲精品久久久久久| 欧美性高清videossexo| 成人av在线资源| 久久成人综合网| 国产精品久久三区| 中文字幕第一区综合| 国产在线国偷精品产拍免费yy| 91美女片黄在线| 亚洲一区国产视频| 欧美在线观看禁18| 亚洲国产综合人成综合网站| 蜜桃视频一区二区| 欧美国产精品v| 日韩成人伦理电影在线观看| 久久不见久久见免费视频1| 精品在线你懂的| 成人app网站| 久久久久久一二三区| 亚洲成人一区在线| 99久久99久久免费精品蜜臀| 欧美白人最猛性xxxxx69交| 最近中文字幕一区二区三区| 亚洲伦在线观看| 天天影视色香欲综合网老头| 91久久精品一区二区三区| 成人三级在线视频| 亚洲国产一区视频| eeuss鲁片一区二区三区在线看| 久久午夜电影网| 天天av天天翘天天综合网色鬼国产| 成人黄色网址在线观看|