0Pricing
Lua Academy · レッスン

基底クラスとコンストラクターの設計

メタテーブルと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フィードバックを取得できます。ローカル設定は不要です。

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

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