0Pricing
Lua Academy · บทเรียน

การสืบทอดหลายระดับ

รองรับสายการสืบทอดที่ลึกหลายระดับด้วยการส่งต่อ __index อย่างถูกต้อง

การสืบทอดหลายระดับ เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

ทบทวนการสืบทอดเดี่ยว

การสืบทอดเดี่ยวทำได้โดยกำหนด Child.__index = Parent การค้นหาเมธอดจะทำดังนี้ หากไม่พบในคลาสย่อย ให้ค้นหาในคลาสแม่ผ่าน __index

การขยายโรงงานคลาสเพื่อรองรับการสืบทอด

เพิ่มเมธอด :extend() ให้คลาสฐาน เพื่อสร้างคลาสย่อยที่เชื่อมโยงกับคลาสแม่

function Animal:extend()
  local cls = {}
  cls.__index = cls
  setmetatable(cls, {__index = self})
  cls.super = self
  function cls:new(...)
    local inst = setmetatable({}, cls)
    if inst.init then inst:init(...) end
    return inst
  end
  return cls
end

การสร้างคลาสย่อย

สร้างคลาสสุนัขให้เป็นคลาสย่อยของคลาสสัตว์ โดยเขียนทับ init และเพิ่มเมธอดใหม่

local Dog = Animal:extend()
function Dog:init(name)
  Dog.super.init(self, name, "Woof")
  self.tricks = {}
end
function Dog:learnTrick(trick)
  self.tricks[#self.tricks+1] = trick
end
local d = Dog:new("Rex")
d:learnTrick("sit")
d:speak()  -- Rex says Woof

สายการสืบทอดหลายระดับ

ขยายคลาสสุนัขเพื่อสร้าง GuideDog ซึ่งเป็นสายการสืบทอดสามระดับ

local GuideDog = Dog:extend()
function GuideDog:init(name, owner)
  GuideDog.super.init(self, name)
  self.owner = owner
end
function GuideDog:guide()
  print(self.name .. " guides " .. self.owner)
end

การเรียกเมธอดของคลาสแม่

เรียกใช้เมธอดของคลาสแม่ผ่านการอ้างอิงคลาสเสมอ ไม่ใช่ผ่านอินสแตนซ์ปัจจุบัน เพื่อหลีกเลี่ยงการเรียกซ้ำไม่สิ้นสุด

function Dog:init(name)
  Dog.super.init(self, name, "Woof")  -- explicit super call
end

ลำดับการแก้ไขเมธอด

Lua แก้ไขเมธอดจากคลาสล่างขึ้นบนผ่านสาย __index GuideDog → สุนัข → สัตว์ → ไม่มีค่า ระบบจะใช้รายการแรกที่พบ

การเขียนทับเมธอด

กำหนดเมธอดที่มีชื่อเดียวกันในคลาสย่อยเพื่อเขียนทับเมธอดเดิม เรียกใช้เมธอดของคลาสแม่อย่างชัดเจนเมื่อต้องการเขียนทับเพียงบางส่วน

function Dog:speak()
  print(self.name .. " barks!")
  Dog.super.speak(self)  -- also call parent speak
end

ข้อจำกัดด้านความลึก

สายการสืบทอดที่ลึกมากทำให้การค้นหาเมธอดช้าลง เพราะแต่ละระดับจะเพิ่มขั้นตอน __index หนึ่งขั้น ควรใช้การประกอบแทนเมื่อมีการสืบทอดมากกว่า 3-4 ระดับ

การตรวจสอบการเป็นสมาชิกของคลาส

เดินไปตามสายเมทาเทเบิลเพื่อตรวจสอบว่าอินสแตนซ์เป็นสมาชิกของคลาสหรือไม่

local function isA(instance, cls)
  local mt = getmetatable(instance)
  while mt do
    if mt == cls then return true end
    mt = getmetatable(mt)
  end
  return false
end
print(isA(d, Dog))     -- true
print(isA(d, Animal))  -- true

การคัดลอกแบบลึกโดยคงคลาสไว้

เมื่อคัดลอกอินสแตนซ์แบบลึก ให้คงเมทาเทเบิลไว้ด้วย เพื่อให้สำเนายังคงเป็นอินสแตนซ์ของคลาสที่ถูกต้อง

ควรเลือกใช้การประกอบเมื่อใด

ใช้การสืบทอดสำหรับความสัมพันธ์แบบเป็น เช่น สุนัขเป็นสัตว์ ใช้การประกอบ (ตารางองค์ประกอบ) สำหรับความสัมพันธ์แบบมี หรือเมื่อต้องการผสมพฤติกรรมอย่างยืดหยุ่น

คำถามเรื่องการสืบทอด

การสืบทอดหลายระดับทำงานใน Lua อย่างไร

ทบทวน: การสืบทอดหลายระดับ

ขยายโรงงานคลาสด้วยเมธอด :extend() ที่เชื่อมโยง __index เป็นสายต่อเนื่อง เรียกใช้เมธอดของคลาสแม่อย่างชัดเจนด้วย ClassName.super.method(self, ...) ตรวจสอบการเป็นสมาชิกโดยเดินไปตามสายเมทาเทเบิล

คำถามที่พบบ่อย

บทเรียน “การสืบทอดหลายระดับ” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การสืบทอดหลายระดับ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การสืบทอดหลายระดับ”

รองรับสายการสืบทอดที่ลึกหลายระดับด้วยการส่งต่อ __index อย่างถูกต้อง คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การสืบทอดหลายระดับ” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม

ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. คลาสฐานและการออกแบบตัวสร้าง
  2. การสืบทอดหลายระดับ
  3. การประกอบมิกซินและการตรวจสอบอินเทอร์เฟซ
  4. instanceof และการตรวจสอบชนิดข้อมูล
← กลับไปที่ Lua Academy