Lua - オブジェクト指向

OOPへの紹介

こんにちは、将来のプログラマーたち!今日は、Luaを使用したオブジェクト指向プログラミング(OOP)の楽しい旅に出発します。プログラミングが初めてであれば心配しないでください。私はYEARSの教室で使用してきた同じ気遣いと熱意で、ステップバイステップでガイドします。

Lua - Object Oriented

オブジェクト指向プログラミングは、LEGOブロックで遊ぶようなものです。それぞれのブロック(またはオブジェクト)には独自のプロパティがあり、特定のことを行うことができます。それらを組み合わせることで、素晴らしい構造(またはプログラム)を創造します!

OOPの特徴

Luaに飛び込む前に、まずOOPの主要な特徴を簡単に見てみましょう:

  1. カプセル化: これはおもちゃを箱に入れるようなものです。箱(オブジェクト)にはすべて関連するもの(データと関数)が含まれています。
  2. 継承: あなたがロボットおもちゃを持っているとします。そして、新しいロボットおもちゃを手に入れると、古いものができるすべてのことをできるだけでなく、新しい技も披露します。これが継承です!
  3. 多様性: これは異なるデバイスに対応するリモコンのようなものです。同じボタンですが、操作するデバイスによって動作が異なります。
  4. 抽象化: ミクログラフを考えると、その内部の動作を知る必要はなく、どのボタンを押すかを知れば十分です。

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

これを分解すると:

  1. Dogというテーブルを作成します。
  2. Dog.__index = Dogを設定します。これは継承に役立ちます。
  3. new関数を作成し、コンストラクタとして機能します。名前と年齢を持つ新しい犬を作成します。
  4. 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