บทช่วยสอน ทับทิมเชิงวัตถุ ที่ดีที่สุดในปี 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

accessors (เข้าถึง) และ Setter (Setter) วิธีการ

เพื่อที่จะใช้ตัวแปรภายนอกของชั้นที่เราจะต้องกำหนดตัวแปรเหล่านี้ในวิธีการเข้าถึงภายในเข้าถึงเป็นทะเยอทะยานเทียบเท่าตัวอย่างต่อไปนี้แสดงให้เห็นถึงวิธีการเข้าถึง:

#!/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

ชั้นใดมีวิธีการเช่น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)

การควบคุมการเข้าถึง

ทับทิมช่วยให้คุณมีสามระดับของการป้องกันเช่นวิธีการซึ่งเป็นภาครัฐภาคเอกชนหรือการป้องกันโปรแกรมใด ๆ การควบคุมการเข้าถึงไม่ได้อยู่ในทับทิมอินสแตนซ์และชั้นตัวแปร

  • วิธีสาธารณะ: วิธีการสาธารณะสามารถเรียกว่าวัตถุใด ๆโดยค่าเริ่มต้นวิธีการเป็นสาธารณะยกเว้นสำหรับวิธีการเริ่มต้นอยู่เสมอส่วนตัว
  • วิธีการส่วนตัว: วิธีการเอกชนไม่สามารถเข้าถึงหรือมองจากนอกชั้นเรียนวิธีการเรียนเท่านั้นที่สามารถเข้าถึงสมาชิกส่วนตัว
  • วิธีป้องกัน: ป้องกันวิธีเท่านั้นที่สามารถเรียกว่าชั้นวัตถุและ subclasses ของมันการเข้าถึงเท่านั้นที่สามารถดำเนินการในระดับภายในและ subclasses ของมัน

นี่เป็นตัวอย่างง่ายๆที่แสดงให้เห็นถึงไวยากรณ์สามปรับปรุง:

#!/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

ซึ่งหมายความว่าการเรียนสามารถกำหนดได้โดยระดับเป็นวัตถุปัจจุบันในการดำเนินการ แต่ยังหมายความว่าเมตาชั้นและความหมายวิธีการเรียนของผู้ปกครองในระหว่างการดำเนินกระบวนการที่มีอยู่

ทับทิมเชิงวัตถุ
10/30