第四章:Ruby 類和對象(繼承)

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目錄結構

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章