Lua - オブジェクト指向
OOPへの紹介
こんにちは、将来のプログラマーたち!今日は、Luaを使用したオブジェクト指向プログラミング(OOP)の楽しい旅に出発します。プログラミングが初めてであれば心配しないでください。私はYEARSの教室で使用してきた同じ気遣いと熱意で、ステップバイステップでガイドします。
オブジェクト指向プログラミングは、LEGOブロックで遊ぶようなものです。それぞれのブロック(またはオブジェクト)には独自のプロパティがあり、特定のことを行うことができます。それらを組み合わせることで、素晴らしい構造(またはプログラム)を創造します!
OOPの特徴
Luaに飛び込む前に、まずOOPの主要な特徴を簡単に見てみましょう:
- カプセル化: これはおもちゃを箱に入れるようなものです。箱(オブジェクト)にはすべて関連するもの(データと関数)が含まれています。
- 継承: あなたがロボットおもちゃを持っているとします。そして、新しいロボットおもちゃを手に入れると、古いものができるすべてのことをできるだけでなく、新しい技も披露します。これが継承です!
- 多様性: これは異なるデバイスに対応するリモコンのようなものです。同じボタンですが、操作するデバイスによって動作が異なります。
- 抽象化: ミクログラフを考えると、その内部の動作を知る必要はなく、どのボタンを押すかを知れば十分です。
LuaでのOOP
さて、これらのOOP概念をLuaでどのように使用できるか見てみましょう。Luaには他の言語のようにビルトインのクラスがないため、テーブルと関数を使用してオブジェクト指向構造を作成します。まるで自分でLEGOセットを構築するようなものです!
シンプルなクラスの作成
まずはシンプルなクラスを作成してみましょう。Luaでは、クラスを表現するためにテーブルを使用します。
local Dog = {}
Dog.__index = Dog
function Dog.new(name, age)
local self = setmetatable({}, Dog)
self.name = name
self.age = age
return self
end
function Dog:bark()
print(self.name .. " says: Woof!")
end
これを分解すると:
-
Dog
というテーブルを作成します。 -
Dog.__index = Dog
を設定します。これは継承に役立ちます。 -
new
関数を作成し、コンストラクタとして機能します。名前と年齢を持つ新しい犬を作成します。 -
Dog
クラスにbark
メソッドを追加します。
オブジェクトの作成
さて、私たちのDogクラスがありますので、Dogオブジェクトを作成してみましょう:
local myDog = Dog.new("Buddy", 3)
おめでとうございます!あなたは刚刚的第一个オブジェクトを作成しました。myDog
は現在、名前が"Buddy"で年齢が3歳のDogオブジェクトです。
プロパティのアクセス
私たちの犬のプロパティにアクセスする方法は以下の通りです:
print(myDog.name) -- 出力: Buddy
print(myDog.age) -- 出力: 3
ドット記法を使用するだけのシンプルさです!
メンバ関数のアクセス
私たちの犬を吠えさせるために、barkメソッドを呼び出します:
myDog:bark() -- 出力: Buddy says: Woof!
ドットの代わりにコロン:
を使用することに注意してください。これはself
をメソッドに渡すLuaの方法です。
完全な例
すべてを合わせてみましょう:
local Dog = {}
Dog.__index = Dog
function Dog.new(name, age)
local self = setmetatable({}, Dog)
self.name = name
self.age = age
return self
end
function Dog:bark()
print(self.name .. " says: Woof!")
end
local myDog = Dog.new("Buddy", 3)
print(myDog.name) -- 出力: Buddy
print(myDog.age) -- 出力: 3
myDog:bark() -- 出力: Buddy says: Woof!
Luaでの継承
さて、私たちのDogクラスを基にして、もっと具体的な犬の種類 - Labradorを作成してみましょう。これが継承が役に立つ場面です。
local Labrador = {}
setmetatable(Labrador, {__index = Dog})
function Labrador.new(name, age, color)
local self = Dog.new(name, age)
setmetatable(self, {__index = Labrador})
self.color = color
return self
end
function Labrador:swim()
print(self.name .. " is swimming!")
end
ここでは、Labradorクラスを作成し、Dogから継承しています。Dogのすべてのプロパティとメソッドを持ち、新しいプロパティ(color)と新しいメソッド(swim)を持っています。
ベース関数のオーバーライド
ベースクラスからの関数をオーバーライドすることもできます。Labradorに特別なbarkを与えましょう:
function Labrador:bark()
print(self.name .. " says: Woof woof woof!")
end
これで、Labradorが吠えるときはDogとは異なる音を発します。
継承の完全な例
すべてを合わせてみましょう:
local Dog = {}
Dog.__index = Dog
function Dog.new(name, age)
local self = setmetatable({}, Dog)
self.name = name
self.age = age
return self
end
function Dog:bark()
print(self.name .. " says: Woof!")
end
local Labrador = {}
setmetatable(Labrador, {__index = Dog})
function Labrador.new(name, age, color)
local self = Dog.new(name, age)
setmetatable(self, {__index = Labrador})
self.color = color
return self
end
function Labrador:swim()
print(self.name .. " is swimming!")
end
function Labrador:bark()
print(self.name .. " says: Woof woof woof!")
end
local myDog = Dog.new("Buddy", 3)
local myLabrador = Labrador.new("Max", 2, "Yellow")
myDog:bark() -- 出力: Buddy says: Woof!
myLabrador:bark() -- 出力: Max says: Woof woof woof!
myLabrador:swim() -- 出力: Max is swimming!
そして、ここにあります!基本的なクラス構造を作成し、継承を実装し、メソッドをオーバーライドしました。LuaのOOPエキスパートへの道は開かれました!
練習は完璧を生みます。自分でクラスを作成し、さまざまなプロパティとメソッドを試してみてください。ハッピーコーディング!
Credits: Image by storyset