◆Luaでテンプレートメソッドパターン
今回はLua初心者のくせにテンプレートメソッドパターンに挑戦してしまいました。テンプレートメソッドパターンについてはここ参照
無理矢理感が否めないので、ぜんぜんちっげーよ!ってコメント待ってます!
まずは、簡単にクラス図の説明を書きます。
なんかどっかでみたよーな命名ですが気にしない気にしない
CaffeineBeverageクラス(Superクラス)
△
|
----------------
| |
Coffeeクラス Teaクラス
以下ソースコード
CaffeineBeverage.lua
----------------------------------------
--CaffeineBeverageクラス
----------------------------------------
CaffeineBeverage = {}
-- new
function CaffeineBeverage:new(_caffeineBeverage)
local obj = {}
-- field
if _caffeineBeverage then
obj.name = _caffeineBeverage.name
else
obj.name = ""
end
self.__index = self
setmetatable(obj, self)
return obj
end
-- property
function CaffeineBeverage:set(_name)
self.name = _name
end
-- __tostring over ride
function CaffeineBeverage:__tostring()
return "name:"..self.name
end
-- clone
function CaffeineBeverage:clone()
return CaffeineBeverage:new(self)
end
-- prepareRecipe
function CaffeineBeverage:prepareRecipe()
CaffeineBeverage:boilWater()
CaffeineBeverage:brew()
CaffeineBeverage:pourInCup()
CaffeineBeverage:addCondiments()
end
-- boilWater
function CaffeineBeverage:boilWater()
print("お湯を沸かす。。。")
end
-- brew()
function CaffeineBeverage:brew()
error("have to override")
end
-- pourInCup
function CaffeineBeverage:pourInCup()
print("カップに注ぐ。。。")
end
-- addCondiments
function CaffeineBeverage:addCondiments()
error("have to override")
end
Coffee.lua
dofile("CaffeineBeverage.lua") -- C/C++で言うところの#include
----------------------------------------
--Coffeeクラス
----------------------------------------
Coffee = {}
-- new
function Coffee:new(_coffee)
obj = {}
-- field
if _coffee then
obj = CaffeineBeverage:new(_coffee)
else
obj = CaffeineBeverage:new()
end
-- clone (override)
obj.__index.brew = function()
return Coffee:new(self)
end
-- brew (overrice)
obj.__index.brew = function()
print("コーヒーをドリップする")
end
-- addCondiments (override)
obj.__index.addCondiments = function()
print("砂糖とクリープを加える")
end
return obj
end
Tea.lua
dofile("CaffeineBeverage.lua")
----------------------------------------
--Teaクラス
----------------------------------------
Tea = {}
-- new
function Tea:new(_tea)
obj = {}
-- field
if _tea then
obj = CaffeineBeverage:new(_tea)
else
obj = CaffeineBeverage:new()
end
-- clone
obj.__index.brew = function()
return Tea:new(self)
end
-- brew
obj.__index.brew = function()
print("ティーバッグをお湯に浸す")
end
-- addCondiments
obj.__index.addCondiments = function()
print("砂糖とレモン")
end
return obj
end
main.lua
dofile("Coffee.lua")
dofile("Tea.lua")
----------------------------------------
-- main
----------------------------------------
function main()
print("--コーヒーの生成")
a = Coffee:new()
a:set("コーヒー")
print(a)
a:prepareRecipe()
print("\n")
print("--紅茶の生成")
b = Tea:new()
b:set("紅茶")
print(b)
b:prepareRecipe()
print("\n")
print("--コピーコンストラクタの使用")
c = Tea:new(b)
print(c)
c:set("レモンティ")
print(c)
print(b)
print("\n")
print("クローン")
d = c:clone()
print(d)
d:set("レモンの紅茶")
print(d)
print(c)
end
-- call main
-- try catchみたいなの使ってます。
-- error()ってメソッドがthrowに相当します。
local status, err = pcall(main)
if status then
-- do nothing
else
print(err)
end
0 件のコメント:
コメントを投稿