คลาสฐานและการออกแบบตัวสร้าง
ออกแบบโรงงาน Class() ที่ตั้งค่าเมทาเทเบิลและตัวสร้าง new()
คลาสฐานและการออกแบบตัวสร้าง เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
เป้าหมาย: โรงงานคลาสที่นำกลับมาใช้ได้
เราต้องการฟังก์ชัน Class() ที่คืนค่าออบเจ็กต์คลาสใหม่ พร้อมตัวสร้าง การค้นหาเมธอด และความหมายของการเขียนโปรแกรมเชิงวัตถุที่ถูกต้อง
โครงร่างโรงงานคลาส
โรงงานจะสร้างตารางคลาสพร้อมเมทาเทเบิลสำหรับกระจายการเรียกใช้เมธอด
local function Class()
local cls = {}
cls.__index = cls
cls.__name = "AnonymousClass"
function cls:new(...)
local instance = setmetatable({}, cls)
if instance.init then instance:init(...) end
return instance
end
return cls
endการกำหนดคลาส
สร้างคลาส กำหนด init (ตัวสร้าง) และเพิ่มเมธอด
local Animal = Class()
Animal.__name = "Animal"
function Animal:init(name, sound)
self.name = name
self.sound = sound
end
function Animal:speak()
print(self.name .. " says " .. self.sound)
end
local cat = Animal:new("Cat", "Meow")
cat:speak() -- Cat says Meowรูปแบบตัวสร้าง
ตัวสร้าง :new(...) จะสร้างอินสแตนซ์ผ่าน setmetatable({}, cls) จากนั้นเรียก :init(...) เพื่อเริ่มต้นการทำงาน วิธีนี้แยกการจัดสรรออกจากการเริ่มต้น
ชื่อคลาสสำหรับการแก้ไขข้อบกพร่อง
เก็บ cls.__name และกำหนด __tostring เพื่อให้อินสแตนซ์แสดงผลได้อย่างมีความหมาย
function Animal:__tostring()
return "<" .. Animal.__name .. ": " .. self.name .. ">"
end
print(tostring(cat)) -- <Animal: Cat>ค่าเริ่มต้นใน init
กำหนดค่าเริ่มต้นใน init โดยใช้ or
function Vehicle:init(opts)
self.speed = opts.speed or 0
self.fuel = opts.fuel or 100
self.engine = opts.engine or "petrol"
endเมธอดคลาสเทียบกับเมธอดอินสแตนซ์
เมธอดที่กำหนดด้วย function cls.method() เป็นเมธอดคลาส (ไม่มี self) ส่วนเมธอดที่กำหนดด้วย function cls:method() จะได้รับอินสแตนซ์เป็น self
คุณสมบัติคงที่
คุณสมบัติที่กำหนดโดยตรงบนตารางคลาสจะใช้ร่วมกันโดยทุกอินสแตนซ์ เว้นแต่จะถูกบดบังด้วยฟิลด์ของอินสแตนซ์
Animal.count = 0
function Animal:init(name, sound)
Animal.count = Animal.count + 1
self.name = name; self.sound = sound
end
print(Animal.count) -- 0
Animal:new("Dog","Woof")
print(Animal.count) -- 1ตัวสร้างสำเนา
เมธอด :clone() จะสร้างสำเนาของอินสแตนซ์โดยคัดลอกฟิลด์แบบตื้น
function Animal:clone()
local copy = setmetatable({}, getmetatable(self))
for k, v in pairs(self) do copy[k] = v end
return copy
endเมทาเมธอดความเท่ากัน
กำหนด __eq เพื่อให้การเปรียบเทียบความเท่ากันระหว่างอินสแตนซ์มีความหมาย
Animal.__eq = function(a, b)
return a.name == b.name
endเหตุใดจึงไม่ใช้การอ่านค่าโดยตรง
ใช้ self.field (ไม่ใช้ rawget) เพื่อให้คลาสที่สืบทอดสามารถเข้าถึงฟิลด์ผ่านเมทาเมธอดได้ ใช้ rawget เฉพาะเมื่อต้องการข้ามกลไกนี้โดยตั้งใจ
คำถามเรื่องการออกแบบตัวสร้าง
เหตุใดจึงเรียก init แยกจากตัวจัดสรร new
ทบทวน: คลาสฐานและตัวสร้าง
โรงงาน Class() สร้างตารางให้เป็นคลาส กำหนด __index = cls สำหรับการค้นหาเมธอด และมี :new() กับ :init() นี่คือพื้นฐานของรูปแบบการเขียนโปรแกรมเชิงวัตถุใน Lua ทั้งหมด
คำถามที่พบบ่อย
บทเรียน “คลาสฐานและการออกแบบตัวสร้าง” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “คลาสฐานและการออกแบบตัวสร้าง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “คลาสฐานและการออกแบบตัวสร้าง”
ออกแบบโรงงาน Class() ที่ตั้งค่าเมทาเทเบิลและตัวสร้าง new() คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน
บทเรียน “คลาสฐานและการออกแบบตัวสร้าง” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม
ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- คลาสฐานและการออกแบบตัวสร้าง
- การสืบทอดหลายระดับ
- การประกอบมิกซินและการตรวจสอบอินเทอร์เฟซ
- instanceof และการตรวจสอบชนิดข้อมูล