Ruby 是一種完美的面向對象編程語言。面向對象編程語言的特性包括:
- 數據封裝
- 數據抽象
- 多態性
- 繼承
類:
一個面向對象的程序,涉及到的類和對象。類是個別對象創建的藍圖。在面向對象的術語中,您的自行車是自行車類的一個實例。
以車輛爲例,它包括車輪(wheels)、馬力(horsepower)、燃油或燃氣罐容量(fuel or gas tank capacity)。這些屬性形成了車輛(Vehicle)類的數據成員。藉助這些屬性您能把一個車輛從其他車輛中區分出來。
車輛也能包含特定的函數,比如暫停(halting)、駕駛(driving)、超速(speeding)。這些函數形成了車輛(Vehicle)類的數據成員。因此,您可以定義類爲屬性和函數的組合。
類 Vehicle 的定義如下:
在 Ruby 中定義類
爲了使用 Ruby 實現面向對象編程,您需要先學習如何在 Ruby 中創建對象和類。
在 Ruby 中,類總是以關鍵字 class 開始,後跟類的名稱。類名的首字母應該大寫。類 Customer 如下所示:
class Customer
end
您可以使用關鍵字 end 終止一個類。類 中的所有數據成員都是介於類定義和 end 關鍵字之間。
Ruby 類中的變量
Ruby 提供了四種類型的變量:
- 局部變量:局部變量是在方法中定義的變量。局部變量在方法外是不可用的。在後續的章節中,您將看到有關方法的更多細節。局部變量以小寫字母或 _ 開始。
#!/usr/bin/ruby -w
BEGIN{
puts "歡迎學習Ruby開發……"
}
END{
puts "期待你的再次學習!"
}
#對象 到 類
class GameInfo
#類被創建實例時執行
def initialize(id,name,date,chNo)
String gameID = id
String gameName = name
String gameDate = date
String gameCh = chNo
puts "顯示信息:遊戲ID:"+gameID+";遊戲名稱:"+gameName+";遊戲年份:"+gameDate+";渠道編號:"+gameCh;
end
end
#類 到 實例
gameInfos = GameInfo.new("1002","俄羅斯方塊","1991","10002");
gameInfos = GameInfo.new("1003","超級瑪麗","1993","10003");
gameInfos = GameInfo.new("1004","貪喫蛇","1994","10004");
- 實例變量:實例變量可以跨任何特定的實例或對象中的方法使用。這意味着,實例變量可以從對象到對象的改變。實例變量在變量名之前放置符號(@)。
#!/usr/bin/ruby -w
BEGIN{
puts "歡迎學習Ruby開發……"
}
END{
puts "期待你的再次學習!"
}
#對象 到 類
class GameInfo
@gameID = ""
@gameName = ""
@gameDate = ""
@gameCh = ""
#類被創建實例時執行
def initialize(id,name,date,chNo)
@gameID = id
@gameName = name
@gameDate = date
@gameCh = chNo
puts "顯示信息:遊戲ID:"+@gameID+";遊戲名稱:"+@gameName+";遊戲年份:"+@gameDate+";渠道編號:"+@gameCh;
end
#輸出遊戲信息
def gmInfoShow()
end
end
#類 到 實例
gameInfos = GameInfo.new("1002","俄羅斯方塊","1991","10002");
gameInfos = GameInfo.new("1003","超級瑪麗","1993","10003");
gameInfos = GameInfo.new("1004","貪喫蛇","1994","10004");
- 類變量:類變量可以跨不同的對象使用。類變量屬於類,且是類的一個屬性。類變量在變量名之前放置符號(@@)。
#!/usr/bin/ruby -w
BEGIN{
puts "歡迎學習Ruby開發……"
}
END{
puts "期待你的再次學習!"
}
#對象 到 類
class GameInfo
@@gameID = "1001";#遊戲ID
@@gameName = "鬥地主";#遊戲名稱
@@gameDate = "2019";#上線年份
@@gameCh = "10001";#渠道編號
#類被創建實例時執行
def initialize(id,name,date,chNo)
@@gameID = id
@@gameName = name
@@gameDate = date
@@gameCh = chNo
end
#輸出遊戲信息
def gmInfoShow()
puts "顯示信息:遊戲ID:"+@@gameID+";遊戲名稱:"+@@gameName+";遊戲年份:"+@@gameDate+";渠道編號:"+@@gameCh;
end
end
#類 到 實例
gameInfos = GameInfo.new("1002","俄羅斯方塊","1991","10002");
gameInfos.gmInfoShow
gameInfos = GameInfo.new("1003","超級瑪麗","1993","10003");
gameInfos.gmInfoShow
gameInfos = GameInfo.new("1004","貪喫蛇","1994","10004");
gameInfos.gmInfoShow
- 全局變量:類變量不能跨類使用。如果您想要有一個可以跨類使用的變量,您需要定義全局變量。全局變量總是以美元符號($)開始。
#!/usr/bin/ruby -w
BEGIN{
puts "歡迎學習Ruby開發……"
}
END{
puts "期待你的再次學習!"
}
#對象 到 類
class GameInfo
$gameID = "1001";#遊戲ID
$gameName = "鬥地主";#遊戲名稱
$gameDate = "2019";#上線年份
$gameCh = "10001";#渠道編號
#類被創建實例時執行
def initialize(id,name,date,chNo)
$gameID = id
$gameName = name
$gameDate = date
$gameCh = chNo
end
#輸出遊戲信息
def gmInfoShow()
puts "顯示信息:遊戲ID:"+$gameID+";遊戲名稱:"+$gameName+";遊戲年份:"+$gameDate+";渠道編號:"+$gameCh;
end
end
#類 到 實例
gameInfos = GameInfo.new("1002","俄羅斯方塊","1991","10002");
gameInfos.gmInfoShow
gameInfos = GameInfo.new("1003","超級瑪麗","1993","10003");
gameInfos.gmInfoShow
gameInfos = GameInfo.new("1004","貪喫蛇","1994","10004");
gameInfos.gmInfoShow
在 Ruby 中使用 new 方法創建對象
對象是類的實例。現在您將學習如何在 Ruby 中創建類的對象。在 Ruby 中,您可以使用類的方法 new 創建對象。
方法 new 是一種獨特的方法,在 Ruby 庫中預定義。new 方法屬於類方法。
下面的實例創建了類 Customer 的兩個對象 cust1 和 cust2:
gameInfos = GameInfo.new("1002","俄羅斯方塊","1991","10002");
gameInfos.gmInfoShow
自定義方法來創建 Ruby 對象
您可以給方法 new 傳遞參數,這些參數可用於初始化類變量。
當您想要聲明帶參數的 new 方法時,您需要在創建類的同時聲明方法 initialize。
initialize 方法是一種特殊類型的方法,將在調用帶參數的類的 new 方法時執行。
下面的實例創建了 initialize 方法:
#類被創建實例時執行
def initialize(id,name,date,chNo)
$gameID = id
$gameName = name
$gameDate = date
$gameCh = chNo
end
Ruby 類中的成員函數
在 Ruby 中,函數被稱爲方法。類中的每個方法是以關鍵字 def 開始,後跟方法名。
方法名總是以小寫字母開頭。在 Ruby 中,您可以使用關鍵字 end 來結束一個方法。
下面的實例定義了一個 Ruby 方法:
#輸出遊戲信息
def gmInfoShow()
puts "顯示信息:遊戲ID:"+$gameID+";遊戲名稱:"+$gameName+";遊戲年份:"+$gameDate+";渠道編號:"+$gameCh;
end
類的集成及方法重寫
繼承的符號是 " < "
注意:類繼承後,如果方法被重寫,則在調用子類時:以子類重寫後的方法爲主,"initialize"方法也不例外,
如果父類 有“initialize”方法,子類沒有“initialize”方法,則子類的創建實例時,必須遵守父類的“initialize”方法進行實例的創建,不然會報錯
#!/usr/bin/ruby
# -*- coding: UTF-8 -*-
class A
def initialize(name, age)
@name = name
@age = age
end
def showInfo(name)
puts "我是父類方法showInfo"
end
end
class B < A
def initialize(name)
@name = name
end
def showInfo(name)
@name = name
puts "我是子類方法showInfo:#@name"
end
end
b = B.new("zs")
b.showInfo("張三")
a = A.new("zs","12")
a.showInfo("張三")
ruby多文件繼承方式
Person class文件類Person .rb
#!/uer/bin/ruby -w
# -*- coding:UTF-8 -*-
#人員類
class Person
String @@name = "";#用戶姓名
String @@age="";#用戶年齡
#初始化函數
def initialize(uname,uage)
@@name = uname;
@@age = uage;
puts "【Person類初始化】用戶名爲:#{@@name},\t年齡爲:#{@@age}"
end
#顯示用戶信息
def userShow(uname,uage)
@@name = uname;
@@age = uage;
puts "【Person類顯示用戶信息】用戶名爲:#{@@name},\t年齡爲:#{@@age}"
end
end
Student calss 文件引用 Person .rb 文件 並繼承 A類
#!/uer/bin/ruby -w
# -*- coding:UTF-8 -*-
Dir[File.dirname(__FILE__) + './class/*.rb'].each {|file| require file }
#學生類
#繼承符號爲 “<”
class Student < Person
@@grade ="0";
#初始化函數
def initialize()
puts "【Student類初始化】……"
end
#顯示學生信息
def showStuInfo(sname,sage,sgrade)
@@name = sname;
@@age = sage;
@@grade =sgrade;
puts "【學生信息】姓名:#{@@name},年齡:#{@@age},成績:#{@@grade},"
end
#顯示用戶信息
def userShow(uname,uage)
@@name = uname;
@@age = uage;
puts "【Student類顯示用戶信息】用戶名爲:#{@@name},\t年齡爲:#{@@age}"
end
end
stuInfo = Student.new
stuInfo.showStuInfo("高漸離","25","100")
stuInfo.userShow("李白","25");
class目錄結構