属性の初期化
CoddyのLuaジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 9/70。
学習した:new()コンストラクターはオブジェクトを作成しますが、すべてのインスタンスが同じ状態で始まります。実際のオブジェクトには固有のデータが必要です。たとえば、人物には特定の名前があり、プレイヤーには開始時のスコアがあります。オブジェクトを役立つものにするには、コンストラクターが引数を受け取り、それらを新しいインスタンスに割り当てる必要があります。
コンストラクターを拡張して初期値を受け取れるようにする方法は次のとおりです。
local Dog = {}
Dog.__index = Dog
function Dog:new(name, breed)
local instance = {}
setmetatable(instance, self)
instance.name = name
instance.breed = breed
return instance
end
function Dog:introduce()
print("I am " .. self.name .. ", a " .. self.breed)
endconstructor は現在、name と breed をパラメータとして受け取ります。空の instance を作成してその metatable を設定した後、これらの値を instance のフィールドに直接割り当てます。作成される各オブジェクトは、それぞれ独自の name と breed を持つことになります。
local dog1 = Dog:new("Rex", "German Shepherd")
local dog2 = Dog:new("Bella", "Poodle")
dog1:introduce() -- 出力: 私は Rex、a German Shepherd
dog2:introduce() -- 出力: 私は Bella、a Poodleどちらの犬もプロトタイプから同じ:introduce()メソッドを共有していますが、それぞれのインスタンステーブルには固有の名前とbreedが格納されています。これは、プロトタイプとパラメーター化されたconstructorを組み合わせることの強みです。つまり、共有される動作と個別の状態を両立できます。
チャレンジ
簡単独自の名前と年齢を持つ一意の個人を作成する Person class を構築しましょう。適切な module 構造を練習するため、コードを2つのファイルに分けて整理します。
次のものを作成します:
Person.lua:name と age を受け取る constructor を備えたPersonclass を Define します。各 person が自分自身を紹介できる:introduce()method を含めます。main.lua:Person module を Require し、提供された入力を使用して person instance を作成します。その後、自分自身を紹介させます。
:new(name, age) constructor は両方の値を受け取り、新しい instance に Store する必要があります。:introduce() method は、次の正確な形式で出力する必要があります:
Hello, my name is [name] and I am [age] years old2つの入力を受け取ります:
- person の name
- person の age
たとえば、入力が Alice と 25 の場合、Output は次のようになります:
Hello, my name is Alice and I am 25 years old自分で試してみよう
-- Personモジュールを読み込む
local Person = require('Person')
-- 入力を読み取る
local name = io.read()
local age = io.read()
-- TODO: Person:new(name, age)を使用して新しいPersonインスタンスを作成する
-- TODO: personインスタンスでintroduce()メソッドを呼び出す
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Luaオンラインコンパイラ