บทช่วยสอน ทับทิมเชิงวัตถุ ที่ดีที่สุดในปี 2024 ในบทช่วยสอนนี้ คุณสามารถเรียนรู้ การกำหนดระดับทับทิม,ทับทิมคำจำกัดความของวัตถุ,เริ่มต้นวิธีการ,ตัวแปรเช่น,accessors (เข้าถึง) และ Setter (Setter) วิธีการ,วิธีการเช่น,วิธีการเรียนและตัวแปรระดับ,วิธี to_s,การควบคุมการเข้าถึง,มรดกระดับ,วิธีการบรรทุกเกินพิกัด,ดำเนินงานมาก,วัตถุแช่แข็ง,ค่าคงที่ระดับ,ใช้จัดสรรสร้างวัตถุ,ข้อมูลระดับ,
ทับทิมเป็นภาษาเชิงวัตถุบริสุทธิ์ทับทิมทุกอย่างอยู่ในรูปแบบของวัตถุ ค่าในแต่ละทับทิมเป็นวัตถุแม้สิ่งดั้งเดิมที่สุด: สตริง, ตัวเลข, และแม้กระทั่งความจริงและเท็จเป็นวัตถุชั้นเองเป็นวัตถุที่เป็นตัวอย่างของการเรียนคลาสบทนี้จะบอกคุณอธิบายฟังก์ชั่นทั้งหมดที่สำคัญที่เกี่ยวข้องกับทับทิมเชิงวัตถุ
ชั้นถูกนำมาใช้ในรูปแบบวัตถุที่ระบุซึ่งรวมการแสดงข้อมูลและวิธีการในการจัดระเบียบข้อมูลลงในแพคเกจที่เรียบร้อย ข้อมูลการเรียนและวิธีการที่เรียกว่าสมาชิกของชั้นเรียน
เมื่อคุณกำหนดชั้นเรียนคุณจริงกำหนดพิมพ์เขียวสำหรับชนิดข้อมูลที่ นี้ที่จริงไม่ได้กำหนดข้อมูลใด ๆ แต่ความหมายของสิ่งที่ชื่อของวิธีการเรียนที่เป็นที่จะบอกความหมายของสิ่งที่ถือว่าเป็นวัตถุของคลาสจะเป็นและการกระทำที่สามารถดำเนินการในวัตถุ
การกำหนดระดับชั้นเริ่มต้นด้วยคำหลักตามด้วยชื่อชั้นและในที่สุดก็จบลงด้วยการเป็นตัวแทนแยกลดคำจำกัดความดังกล่าวตัวอย่างเช่นเราใช้คำระดับเพื่อกำหนดระดับชั้นกล่องดังต่อไปนี้:
class Box code end
โดยการประชุมชื่อที่จะต้องเริ่มต้นด้วยอักษรตัวใหญ่ถ้ามันมีมากกว่าหนึ่งคำใช้ตัวอักษรตัวแรกของแต่ละคำ แต่นี่คือไม่มีตัวคั่น (ตัวอย่างเช่น: CamelCase)
ระดับให้พิมพ์เขียวสำหรับวัตถุดังนั้นโดยทั่วไปวัตถุที่ถูกสร้างขึ้นให้สอดคล้องกับการเรียนเราใช้คำหลักใหม่ที่จะประกาศเป็นวัตถุชั้นเรียนข้อความต่อไปนี้ขอประกาศในตู้ชั้นสองวัตถุ:
box1 = Box.new box2 = Box.new
วิธีการเริ่มต้นเป็นวิธีการเรียนทับทิมมาตรฐานคือคอนสตรัคของชั้นคล้ายกับเขียนโปรแกรมเชิงวัตถุภาษาอื่น ๆ งานคอนสตรัคเมื่อคุณต้องการที่จะเริ่มต้นตัวแปรบางอย่างในชั้นเรียนเพื่อสร้างวัตถุในเวลาเดียวกันเริ่มต้นวิธีการมาในสะดวก วิธีการใช้ชุดของการขัดแย้งเช่นวิธีทับทิมอื่น ๆ โดยใช้วิธีการนี้จะต้องมีการวางไว้ในด้านหน้าของคำหลักdef ดังต่อไปนี้:
class Box def initialize(w,h) @width, @height = w, h end end
ระดับทรัพย์สินตัวแปรเช่นที่พวกเขาสร้างเมื่อใช้วัตถุชั้นจะกลายเป็นทรัพย์สินของวัตถุคุณสมบัติของแต่ละวัตถุที่ได้รับมอบหมายในหมู่วัตถุอื่น ๆ และไม่เปิดเผยค่า ภายในชั้นเรียนคือการใช้ตัวดำเนิน @เพื่อเข้าถึงคุณสมบัติของผู้ที่อยู่นอกชั้นเรียนมันเป็นเรื่องธรรมดาที่จะใช้วิธีที่เรียกว่าวิธีการเข้าถึงของการเข้าถึงที่นี่เรากำหนดกล่องระดับดังกล่าวข้างต้นเป็นตัวอย่างที่ @width คลาสกล่องและ @height เป็นตัวแปรเช่น
class Box def initialize(w,h) # 给实例变量赋值 @width, @height = w, h end end
เพื่อที่จะใช้ตัวแปรภายนอกของชั้นที่เราจะต้องกำหนดตัวแปรเหล่านี้ในวิธีการเข้าถึงภายในเข้าถึงเป็นทะเยอทะยานเทียบเท่าตัวอย่างต่อไปนี้แสดงให้เห็นถึงวิธีการเข้าถึง:
#!/usr/bin/ruby -w # 定义类 class Box # 构造函数 def initialize(w,h) @width, @height = w, h end # 访问器方法 def printWidth @width end def printHeight @height end end # 创建对象 box = Box.new(10, 20) # 使用访问器方法 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
คล้ายกับวิธีการเข้าถึงที่ใช้เพื่อเข้าถึงค่าตัวแปรทับทิมมีวิธีการตั้งค่าภายนอกตัวแปรของคลาส A,ยังเป็นที่รู้จักวิธีการตั้งค่าที่กำหนดไว้ดังต่อไปนี้:
#!/usr/bin/ruby -w # 定义类 class Box # 构造器方法 def initialize(w,h) @width, @height = w, h end # 访问器方法 def getWidth @width end def getHeight @height end # 设置器方法 def setWidth=(value) @width = value end def setHeight=(value) @height = value end end # 创建对象 box = Box.new(10, 20) # 使用设置器方法 box.setWidth = 30 box.setHeight = 50 # 使用访问器方法 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 # 定义类 class Box # 构造方法 def initialize(w,h) @width, @height = w, h end # 实例方法 def getArea @width * @height end end # 创建对象 box = Box.new(10, 20) # 调用实例方法 a = box.getArea() puts "Area of the box is : #{a}"
เมื่อโค้ดข้างต้นจะถูกดำเนินการก็จะให้ผลลัพธ์ที่ต่อไปนี้:
Area of the box is : 200
ตัวแปรที่ทันสมัยในทุกกรณีของตัวแปรระดับที่ใช้ร่วมกันในคำอื่น ๆ เช่นตัวแปรระดับที่สามารถเข้าถึงได้ทุกกรณีวัตถุ ตัวแปรที่มีสองชั้น @ ตัวอักษร (@@) เป็นคำนำหน้า, ตัวแปรระดับจะต้องเริ่มต้นได้ในการกำหนดชั้นดังแสดงในตัวอย่างต่อไปนี้
วิธีการเรียน def self.methodname ()ความหมายวิธีการเรียนที่จะจบคั่น วิธีการเรียนที่สามารถใช้กับรูปแบบที่ชื่อชั้นclassname.methodname ของสายตามที่แสดงในตัวอย่างต่อไปนี้:
#!/usr/bin/ruby -w class Box # 初始化类变量 @@count = 0 def initialize(w,h) # 给实例变量赋值 @width, @height = w, h @@count += 1 end def self.printCount() puts "Box count is : #@@count" end end # 创建两个对象 box1 = Box.new(10, 20) box2 = Box.new(30, 100) # 调用类方法来输出盒子计数 Box.printCount()
เมื่อโค้ดข้างต้นจะถูกดำเนินการก็จะให้ผลลัพธ์ที่ต่อไปนี้:
Box count is : 2
ชั้นใดมีวิธีการเช่นto_s ที่คุณกำหนดที่จะกลับมาเป็นตัวแทนสตริงของวัตถุนี่คือตัวอย่างง่ายๆตามที่กว้างและความสูงแสดงวัตถุ Box:
#!/usr/bin/ruby -w class Box # 构造器方法 def initialize(w,h) @width, @height = w, h end # 定义 to_s 方法 def to_s "(w:#@width,h:#@height)" # 对象的字符串格式 end end # 创建对象 box = Box.new(10, 20) # 自动调用 to_s 方法 puts "String representation of box is : #{box}"
เมื่อโค้ดข้างต้นจะถูกดำเนินการก็จะให้ผลลัพธ์ที่ต่อไปนี้:
String representation of box is : (w:10,h:20)
ทับทิมช่วยให้คุณมีสามระดับของการป้องกันเช่นวิธีการซึ่งเป็นภาครัฐภาคเอกชนหรือการป้องกันโปรแกรมใด ๆ การควบคุมการเข้าถึงไม่ได้อยู่ในทับทิมอินสแตนซ์และชั้นตัวแปร
นี่เป็นตัวอย่างง่ายๆที่แสดงให้เห็นถึงไวยากรณ์สามปรับปรุง:
#!/usr/bin/ruby -w # 定义类 class Box # 构造器方法 def initialize(w,h) @width, @height = w, h end # 实例方法默认是 public 的 def getArea getWidth() * getHeight end # 定义 private 的访问器方法 def getWidth @width end def getHeight @height end # make them private private :getWidth, :getHeight # 用于输出面积的实例方法 def printArea @area = getWidth() * getHeight puts "Big box area is : #@area" end # 让实例方法是 protected 的 protected :printArea end # 创建对象 box = Box.new(10, 20) # 调用实例方法 a = box.getArea() puts "Area of the box is : #{a}" # 尝试调用 protected 的实例方法 box.printArea()
เมื่อโค้ดข้างต้นจะถูกดำเนินการก็จะก่อให้เกิดผลดังต่อไปนี้ นี่เรียกวิธีแรกที่ประสบความสำเร็จ แต่วิธีที่สองจะมีปัญหา
Area of the box is : 200 test.rb:42: protected method `printArea' called for # <Box:0xb7f11280 @height=20, @width=10> (NoMethodError)
มรดก, การเขียนโปรแกรมเชิงวัตถุเป็นหนึ่งในแนวคิดที่สำคัญที่สุด มรดกช่วยให้เราสามารถกำหนดระดับที่ขึ้นอยู่กับระดับอื่นซึ่งทำให้การสร้างและการบำรุงรักษาการใช้งานง่ายมาก
มรดกจะช่วยให้เพื่อนำมาใช้รหัสและดำเนินการอย่างรวดเร็วโชคไม่ดีที่ทับทิมไม่สนับสนุนมรดกหลาย แต่ทับทิมmixins สนับสนุนmixin เป็นเหมือนการดำเนินงานในด้านการมรดกหลายมรดกหลายเพียงส่วนหนึ่งของอินเตอร์เฟซเป็นที่สืบทอด
เมื่อคุณสร้างชั้นโปรแกรมเมอร์สามารถระบุระดับใหม่ที่สืบทอดมาจากชั้นที่มีอยู่ของสมาชิกจึงไม่เขียนจากรอยขีดข่วนใหม่สมาชิกข้อมูลและฟังก์ชั่นสมาชิกชั้นที่มีอยู่จะเรียกว่าชั้นฐานหรือระดับผู้ปกครองชั้นใหม่ที่เรียกว่าชั้นเรียนมาหรือ subclasses
ทับทิมยังมีแนวคิดประเภทรองซับคลาสที่สืบทอดตัวอย่างต่อไปนี้แสดงให้เห็นถึงแนวคิดนี้ การขยายชั้นเรียนไวยากรณ์ง่ายมาก เพียงเพิ่ม <ชื่อตัวละครและระดับผู้ปกครองเพื่องบเรียนสามารถ ตัวอย่างต่อไปนี้จะกำหนดระดับBigBoxBox เป็นประเภทรอง:
#!/usr/bin/ruby -w # 定义类 class Box # 构造器方法 def initialize(w,h) @width, @height = w, h end # 实例方法 def getArea @width * @height end end # 定义子类 class BigBox < Box # 添加一个新的实例方法 def printArea @area = @width * @height puts "Big box area is : #@area" end end # 创建对象 box = BigBox.new(10, 20) # 输出面积 box.printArea()
เมื่อโค้ดข้างต้นจะถูกดำเนินการก็จะให้ผลลัพธ์ที่ต่อไปนี้:
Big box area is : 200
แม้ว่าคุณจะสามารถเพิ่มคุณสมบัติใหม่ในชั้นเรียนมา แต่บางครั้งคุณอาจต้องการที่จะเปลี่ยนพฤติกรรมที่ได้รับการกำหนดไว้ในวิธีการเรียนของผู้ปกครอง จากนั้นคุณสามารถเก็บชื่อวิธีเดียวกันฟังก์ชั่นที่สามารถรับน้ำหนักมากเกินไปวิธีการดังแสดงในตัวอย่างต่อไปนี้:
#!/usr/bin/ruby -w # 定义类 class Box # 构造器方法 def initialize(w,h) @width, @height = w, h end # 实例方法 def getArea @width * @height end end # 定义子类 class BigBox < Box # 改变已有的 getArea 方法 def getArea @area = @width * @height puts "Big box area is : #@area" end end # 创建对象 box = BigBox.new(10, 20) # 使用重载的方法输出面积 box.getArea()
เรียกเอาท์พุทตัวอย่างข้างต้นคือ
Big box area is : 200
เราต้องการที่จะใช้ประกอบการดำเนินการ + นอกจากเวกเตอร์ของวัตถุทั้งสองกล่องใช้ประกอบ * ความกว้างและความสูงของกล่องคูณใช้ประกอบการเอก - ความกว้างและความสูงของกล่องเมื่อตะกี้ นี่คือรุ่นของชั้นเรียนคณิตศาสตร์ที่มีความหมายกล่องผู้ประกอบการ:
class Box def initialize(w,h) # 初始化 width 和 height @width,@height = w, h end def +(other) # 定义 + 来执行向量加法 Box.new(@width + other.width, @height + other.height) end def -@ # 定义一元运算符 - 来对 width 和 height 求反 Box.new(-@width, -@height) end def *(scalar) # 执行标量乘法 Box.new(@width*scalar, @height*scalar) end end
บางครั้งเราต้องการป้องกันไม่ให้วัตถุที่มีการเปลี่ยนแปลง ในวัตถุวิธีการแช่แข็งสามารถบรรลุเป้าหมายนี้ได้อย่างมีประสิทธิภาพสามารถใส่วัตถุลงอย่างต่อเนื่อง วัตถุใด ๆ ที่สามารถแช่แข็งโดยการเรียกObject.freezeวัตถุแช่แข็งไม่สามารถแก้ไขได้, ที่อยู่, คุณไม่สามารถเปลี่ยนตัวแปรเช่นของมัน
คุณสามารถใช้Object.frozen? วิธีการตรวจสอบว่าวัตถุที่ได้รับได้รับการแช่แข็งถ้าวัตถุที่ได้รับการแช่แข็งวิธีการที่ผลตอบแทนจริงมิฉะนั้นจะส่งกลับค่าเท็จ ตัวอย่างต่อไปนี้แสดงให้เห็นถึงแนวคิดนี้:
#!/usr/bin/ruby -w # 定义类 class Box # 构造器方法 def initialize(w,h) @width, @height = w, h end # 访问器方法 def getWidth @width end def getHeight @height end # 设置器方法 def setWidth=(value) @width = value end def setHeight=(value) @height = value end end # 创建对象 box = Box.new(10, 20) # 让我们冻结该对象 box.freeze if( box.frozen? ) puts "Box object is frozen object" else puts "Box object is normal object" end # 现在尝试使用设置器方法 box.setWidth = 30 box.setHeight = 50 # 使用访问器方法 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
คุณสามารถกำหนดระดับภายในอย่างต่อเนื่องโดยทางตรงค่าตัวเลขหรือสตริงกับนิยามตัวแปรซึ่งไม่จำเป็นต้องมีการใช้งานอย่างต่อเนื่องหรือ @ @@ ตามแบบแผนชื่อของการใช้ตัวพิมพ์ใหญ่อย่างต่อเนื่อง
ครั้งหนึ่งเคยเป็นคงที่มีการกำหนดคุณไม่สามารถเปลี่ยนค่าของคุณโดยตรงสามารถเข้าถึงค่าคงที่ภายในในชั้นเรียนเช่นการเข้าถึงตัวแปรเดียวกัน แต่ถ้าคุณต้องการที่จะเข้าถึงระดับคงที่ภายนอกแล้วคุณจะต้องใช้ClassName :: คงที่ ดังแสดงในตัวอย่างต่อไปนี้
#!/usr/bin/ruby -w # 定义类 class Box BOX_COMPANY = "TATA Inc" BOXWEIGHT = 10 # 构造器方法 def initialize(w,h) @width, @height = w, h end # 实例方法 def getArea @width * @height end end # 创建对象 box = Box.new(10, 20) # 调用实例方法 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
ค่าคงที่ระดับสามารถสืบทอด แต่ยังเป็นเช่นเดียวกับวิธีการเช่นมากเกินไป
อาจจะมีกรณีที่คุณต้องการที่จะสร้างวัตถุโดยไม่ต้องโทรเริ่มต้นสร้างวัตถุวัตถุที่ถูกสร้างขึ้นโดยใช้วิธีการใหม่ในกรณีนี้คุณสามารถเรียกจัดสรรให้สร้างวัตถุเตรียมเป็นตัวอย่างต่อไปนี้ ดังต่อไปนี้:
#!/usr/bin/ruby -w # 定义类 class Box attr_accessor :width, :height # 构造器方法 def initialize(w,h) @width, @height = w, h end # 实例方法 def getArea @width * @height end end # 使用 new 创建对象 box1 = Box.new(10, 20) # 使用 allocate 创建两一个对象 box2 = Box.allocate # 使用 box1 调用实例方法 a = box1.getArea() puts "Area of the box is : #{a}" # 使用 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
ทับทิมของตนเองและ Java นี้จะคล้ายกัน แต่ที่แตกต่างกัน Java วิธีการมีการอ้างอิงในวิธีการเช่นนี้จึงมักจะหมายถึงวัตถุปัจจุบัน สายรหัสทับทิมโดยสายดังนั้นในบริบทที่แตกต่าง (บริบท) ตัวเองมีความหมายที่แตกต่างกัน ลองมาดูตัวอย่างต่อไปนี้:
#!/usr/bin/ruby -w class Box # 输出类信息 puts "Class of self = #{self.class}" puts "Name of self = #{self.name}" end
เมื่อโค้ดข้างต้นจะถูกดำเนินการก็จะให้ผลลัพธ์ที่ต่อไปนี้:
Class of self = Class Name of self = Box
ซึ่งหมายความว่าการเรียนสามารถกำหนดได้โดยระดับเป็นวัตถุปัจจุบันในการดำเนินการ แต่ยังหมายความว่าเมตาชั้นและความหมายวิธีการเรียนของผู้ปกครองในระหว่างการดำเนินกระบวนการที่มีอยู่