基底クラスとコンストラクターの設計
メタテーブルとnew()コンストラクターを設定するClass()ファクトリーを設計します。
「基底クラスとコンストラクターの設計」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。
目標: 再利用可能なクラスファクトリ
適切なコンストラクタ、メソッド検索、OOP セマンティクスを備えた新しいクラスオブジェクトを返す 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 でのデフォルト値
or を使用して init にデフォルト値を指定します。
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なぜ rawget ではないのか
派生クラスでメタメソッドによるフィールドアクセスを有効にするため、rawget ではなく self.field を使用します。明示的にバイパスする必要がある場合にだけ rawget を使用します。
コンストラクタ設計に関する質問
init はなぜ new アロケータとは別に呼び出すのですか?
まとめ: 基底クラスとコンストラクタ
Class() ファクトリはテーブルをクラスとして作成し、メソッド検索のために __index = cls を設定し、:new() と :init() を提供します。これはすべての Lua OOP パターンの基盤となります。
よくある質問
「基底クラスとコンストラクターの設計」レッスンは無料ですか?
はい。「基底クラスとコンストラクターの設計」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。
「基底クラスとコンストラクターの設計」で何を学びますか?
メタテーブルとnew()コンストラクターを設定するClass()ファクトリーを設計します。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Lua Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「基底クラスとコンストラクターの設計」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLua Academyレッスンでコードを書いて実行できますか?
はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 基底クラスとコンストラクターの設計
- 多段階継承
- Mixinの合成とインターフェース検査
- instanceofと型イントロスペクション