多段階継承
適切な__index委譲によって深い継承チェーンをサポートします。
「多段階継承」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。
単一継承の復習
単一継承は、Child.__index = Parent と設定することで実現します。メソッド検索では、Child に見つからなければ、__index を通じて Parent を探します。
継承に対応したクラスファクトリの拡張
基底クラスに :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サブクラスの作成
Animal のサブクラスとして Dog を作成し、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多段階の継承チェーン
Dog を拡張して GuideDog を作成し、3 段階の継承チェーンを構築します。
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)
endsuper メソッドの呼び出し
無限再帰を避けるため、super は self 経由ではなく、必ずクラス参照を通じて呼び出します。
function Dog:init(name)
Dog.super.init(self, name, "Woof") -- explicit super call
endメソッド解決順序
Lua は __index チェーンを通じて下位クラスから順にメソッドを解決します。GuideDog → Dog → Animal → nil の順です。最初に見つかったものが使用されます。
メソッドのオーバーライド
サブクラスで同じ名前のメソッドを定義するとオーバーライドできます。一部だけオーバーライドする場合は、super を明示的に呼び出します。
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クラスを保持したディープコピー
インスタンスをディープコピーするときは、コピー後も正しいクラスのインスタンスであり続けるようにメタテーブルを保持します。
コンポジションを選ぶ場面
継承は真の is-a 関係(Dog is-a Animal)に使用します。has-a 関係や柔軟な振る舞いの組み合わせには、コンポジション(コンポーネントテーブル)を使用します。
継承に関する質問
Lua では多段階の継承はどのように機能しますか?
まとめ: 多段階の継承
:extend() メソッドをクラスファクトリに追加し、__index のリンクを連鎖させます。ClassName.super.method(self, ...) で super を明示的に呼び出します。メタテーブルのチェーンをたどって所属を確認します。
よくある質問
「多段階継承」レッスンは無料ですか?
はい。「多段階継承」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。
「多段階継承」で何を学びますか?
適切な__index委譲によって深い継承チェーンをサポートします。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Lua Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「多段階継承」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このLua Academyレッスンでコードを書いて実行できますか?
はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。