การสืบทอดหลายระดับ
รองรับสายการสืบทอดที่ลึกหลายระดับด้วยการส่งต่อ __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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- คลาสฐานและการออกแบบตัวสร้าง
- การสืบทอดหลายระดับ
- การประกอบมิกซินและการตรวจสอบอินเทอร์เฟซ
- instanceof และการตรวจสอบชนิดข้อมูล