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

คลาสฐานและการออกแบบตัวสร้าง

ออกแบบโรงงาน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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