0Pricing
Lua Academy · レッスン

多段階継承

適切な__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)
end

super メソッドの呼び出し

無限再帰を避けるため、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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 基底クラスとコンストラクターの設計
  2. 多段階継承
  3. Mixinの合成とインターフェース検査
  4. instanceofと型イントロスペクション
← Lua Academyに戻る