亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Ruby > 正文

進一步深入Ruby中的類與對象概念

2020-10-29 19:39:39
字體:
來源:轉載
供稿:網友

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

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

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

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

class Box
   code
end

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

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

box1 = Box.newbox2 = 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  endend

訪問器和setter方法:

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

#!/usr/bin/ruby -w# define a classclass Box  # constructor method  def initialize(w,h)   @width, @height = w, h  end  # accessor methods  def printWidth   @width  end  def printHeight   @height  endend# create an objectbox = Box.new(10, 20)# use accessor methodsx = box.printWidth()y = box.printHeight()puts "Width of the box is : #{x}"puts "Height of the box is : #{y}"

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

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

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

#!/usr/bin/ruby -w# define a classclass 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  endend# create an objectbox = Box.new(10, 20)# use setter methodsbox.setWidth = 30box.setHeight = 50# use accessor methodsx = box.getWidth()y = box.getHeight()puts "Width of the box is : #{x}"puts "Height of the box is : #{y}"

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

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

實例方法:

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

#!/usr/bin/ruby -w# define a classclass Box  # constructor method  def initialize(w,h)   @width, @height = w, h  end  # instance method  def getArea   @width * @height  endend# create an objectbox = Box.new(10, 20)# call instance methodsa = box.getArea()puts "Area of the box is : #{a}"

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

Area of the box is : 200

類的方法和變量:

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

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

#!/usr/bin/ruby -wclass 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"  endend# create two objectbox1 = Box.new(10, 20)box2 = Box.new(30, 100)# call class method to print box countBox.printCount()

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

Box count is : 2

 to_s 方法:

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

#!/usr/bin/ruby -wclass 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.  endend# create an objectbox = 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沒有應用實例和類變量的任何訪問控制權。

  1.     Public Methods: 任何人都可以被稱為public方法。方法默認為公用初始化,這始終是 private 除外。 .
  2.     Private Methods: private方法不能被訪問,或者甚至從類的外部瀏覽。只有類方法可以訪問私有成員。
  3.     Protected Methods: 受保護的方法可以被調用,只能通過定義類及其子類的對象。訪問保存在類內部。

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

#!/usr/bin/ruby -w# define a classclass 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 :printAreaend# create an objectbox = Box.new(10, 20)# call instance methodsa = box.getArea()puts "Area of the box is : #{a}"# try to call protected or methodsbox.printArea()

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

Area of the box is : 200test.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 classclass Box  # constructor method  def initialize(w,h)   @width, @height = w, h  end  # instance method  def getArea   @width * @height  endend# define a subclassclass BigBox < Box  # add a new instance method  def printArea   @area = @width * @height   puts "Big box area is : #@area"  endend# create an objectbox = BigBox.new(10, 20)# print the areabox.printArea()

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

Big box area is : 200

方法重載:

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

#!/usr/bin/ruby -w# define a classclass Box  # constructor method  def initialize(w,h)   @width, @height = w, h  end  # instance method  def getArea   @width * @height  endend# define a subclassclass BigBox < Box  # change existing getArea method as follows  def getArea   @area = @width * @height   puts "Big box area is : #@area"  endend# create an objectbox = 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) endend

凍結對象:

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

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

#!/usr/bin/ruby -w# define a classclass 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  endend# create an objectbox = Box.new(10, 20)# let us freez this objectbox.freezeif( box.frozen? )  puts "Box object is frozen object"else  puts "Box object is normal object"end# now try using setter methodsbox.setWidth = 30box.setHeight = 50# use accessor methodsx = box.getWidth()y = box.getHeight()puts "Width of the box is : #{x}"puts "Height of the box is : #{y}"

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

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

類常量:

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

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

#!/usr/bin/ruby -w# define a classclass Box  BOX_COMPANY = "TATA Inc"  BOXWEIGHT = 10  # constructor method  def initialize(w,h)   @width, @height = w, h  end  # instance method  def getArea   @width * @height  endend# create an objectbox = Box.new(10, 20)# call instance methodsa = box.getArea()puts "Area of the box is : #{a}"puts Box::BOX_COMPANYputs "Box weight is: #{Box::BOXWEIGHT}"

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

Area of the box is : 200TATA IncBox weight is: 10

類常量繼承和實例方法一樣,可以覆蓋。
創建對象使用分配:

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

#!/usr/bin/ruby -w# define a classclass Box  attr_accessor :width, :height  # constructor method  def initialize(w,h)   @width, @height = w, h  end  # instance method  def getArea   @width * @height  endend# create an object using newbox1 = Box.new(10, 20)# create another object using allocatebox2 = Box.allocate# call instance method using box1a = box1.getArea()puts "Area of the box is : #{a}"# call instance method using box2a = box2.getArea()puts "Area of the box is : #{a}"

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

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

類信息:

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

#!/usr/bin/ruby -wclass Box  # print class information  puts "Type of self = #{self.type}"  puts "Name of self = #{self.name}"end

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

Type of self = ClassName of self = Box

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
疯狂做受xxxx高潮欧美日本| 中文字幕v亚洲ⅴv天堂| 亚洲视频日韩精品| 欧美国产视频日韩| 欧美激情a∨在线视频播放| 精品无人区乱码1区2区3区在线| 国产成人精品免高潮在线观看| 97视频在线观看网址| 国产午夜精品免费一区二区三区| 精品视频偷偷看在线观看| 国产精品专区一| 国产日韩欧美一二三区| 国产精品久久久久久久午夜| 国产日韩换脸av一区在线观看| 日韩欧美精品免费在线| 青草青草久热精品视频在线观看| 国产精品久久久999| 久久午夜a级毛片| 久久精品国产久精国产思思| 亚洲第一中文字幕在线观看| 亚洲电影成人av99爱色| 亚洲电影免费观看高清完整版在线观看| 成人激情视频在线播放| 久久久久久高潮国产精品视| 美女999久久久精品视频| 精品久久久久久久久久久久| 黄色精品在线看| 国产亚洲精品综合一区91| 国产亚洲欧洲高清| 91av在线免费观看视频| 久久精品国产成人精品| 久久国产精品久久久| 国产一区欧美二区三区| 国产亚洲欧美aaaa| 亚洲第一网中文字幕| 久久青草精品视频免费观看| 在线观看国产精品91| 日本成人黄色片| 日韩经典第一页| 国产精品一区久久久| 欧美日韩国产色视频| 26uuu另类亚洲欧美日本老年| 国产精品免费视频xxxx| 国产精品亚洲精品| 国模私拍视频一区| 色av吧综合网| 亚洲国产精品人人爽夜夜爽| 福利视频一区二区| 国产成人在线亚洲欧美| 伊人久久久久久久久久| 亚洲电影免费在线观看| 国产成人aa精品一区在线播放| 欧美一级免费看| 日韩精品免费在线视频| 午夜精品久久久久久久99热| 国产精品精品一区二区三区午夜版| 国产一区视频在线| 中文字幕亚洲第一| 国产精品丝袜白浆摸在线| 亚洲第一网中文字幕| 韩国三级电影久久久久久| 黄色成人av在线| 国产精品第一页在线| 国产成人精品久久二区二区91| 久热国产精品视频| 国产精品视频在线观看| 欧美日韩精品在线视频| 夜夜躁日日躁狠狠久久88av| 日本午夜人人精品| 在线观看日韩www视频免费| 色999日韩欧美国产| 欧美日韩精品国产| 午夜精品久久久久久久白皮肤| 亚洲女性裸体视频| 国内免费精品永久在线视频| 成人黄色片在线| 国产精品一区二区久久精品| 国产脚交av在线一区二区| 欧美噜噜久久久xxx| 久久久成人的性感天堂| 国产精品视频白浆免费视频| 亚洲va男人天堂| 欧美高跟鞋交xxxxhd| 欧美激情视频网站| 亚洲国产99精品国自产| 国产一区二区在线免费视频| 久久躁日日躁aaaaxxxx| 亚洲国产精品嫩草影院久久| 91大神福利视频在线| 91亚洲永久免费精品| 在线看欧美日韩| 日韩动漫免费观看电视剧高清| 2020国产精品视频| 亚洲人成欧美中文字幕| 亚洲免费av电影| 久久99视频精品| 欧美成人激情图片网| 久久亚洲精品成人| 久久久免费高清电视剧观看| 国模极品一区二区三区| 国产精品中文字幕久久久| 日韩高清不卡av| 欧美有码在线观看视频| 国产精品在线看| 欧美日韩成人免费| 久久视频免费在线播放| 7777kkkk成人观看| 亚洲精品成人久久久| 国产精品一区二区久久精品| 久久精品国产欧美亚洲人人爽| 91精品国产91久久| 91香蕉电影院| 亚洲а∨天堂久久精品9966| 精品在线小视频| 亚洲欧美国产精品久久久久久久| 成人看片人aa| 亚洲一区二区久久久| 国产精品成人一区二区三区吃奶| 日本精品在线视频| 亚洲视频欧洲视频| 4k岛国日韩精品**专区| 国产成人精品视| 欧美一级免费看| 亚洲国产精品电影在线观看| 粉嫩av一区二区三区免费野| 热re91久久精品国99热蜜臀| 欧美午夜精品久久久久久浪潮| 91精品久久久久久久久久久| 日韩成人在线播放| 性色av一区二区三区| 国产视频精品自拍| 91最新国产视频| 国产欧美 在线欧美| 热久久免费国产视频| 久久人人看视频| 怡红院精品视频| 亚洲午夜久久久影院| 精品久久久在线观看| 在线播放日韩av| 中文字幕视频一区二区在线有码| 色偷偷噜噜噜亚洲男人| 国产精品美女久久久免费| 激情成人在线视频| 9.1国产丝袜在线观看| 亚洲国产精品一区二区久| 欧美激情久久久久久| 国产一区视频在线播放| 亚洲自拍偷拍色图| 欧美不卡视频一区发布| 成人免费看吃奶视频网站| 亚洲第一偷拍网| www.国产一区| 国产精品一区二区久久精品| 欧美日产国产成人免费图片| 91老司机精品视频| 亚洲999一在线观看www| 久久久久999| 日本亚洲欧美三级| 久久久久国色av免费观看性色| 国产精品一二三在线| 91香蕉嫩草神马影院在线观看| 亚洲免费av电影| 日韩欧美在线免费观看| 亚洲成人性视频|