1. オブジェクト指向機能
- 1) カプセル化: エンティティの情報、機能、および応答を単一のオブジェクトにパックできる機能を指します。
- 2) 継承: 継承の方法は、元のプログラムを変更せずに拡張できるため、元の機能を維持しながら、新しい機能を拡張することもできます。これにより、繰り返しのコーディングを減らし、ソフトウェア開発の効率を向上させることができます。
- 3) ポリモーフィズム: 同じ操作が異なるオブジェクトに作用し、異なる解釈を持ち、異なる実行結果を生成する可能性があります。実行時に、派生クラスのメソッドは、基本クラスへのポインターを介して呼び出すことができます。
- 4) 抽象化: 抽象化は、複雑な実世界の問題を単純化する方法であり、特定の問題に最も適したクラス定義を見つけ、最も適切な継承レベルで問題を説明できます。
2. Lua でのオブジェクト指向
属性: テーブルを使用して、オブジェクトの属性を記述します。
メソッド: 関数を使用してメソッドを表すことができます。
クラス: テーブル + 関数によってシミュレートされます。
継承: metetable でシミュレートできます (ほとんどの実装では、最も基本的なオブジェクトをシミュレートするだけで十分です)。
Account = {balance = 0}
function Account.withdraw (v)
Account.balance = Account.balance - v
end
新しい関数が作成され、アカウント オブジェクトの撤回フィールドに格納されます。
Account.withdraw(100.00)
3. 簡単な例
次の単純なクラスには、面積、長さ、幅の 3 つのプロパティが含まれており、printArea メソッドを使用して計算結果を出力します。
-- 元类
Rectangle = {area = 0, length = 0, breadth = 0}
-- 派生类的方法 new
-- Rectangle是子类,o是基类
function Rectangle:new (o,length,breadth)
o = o or {}
setmetatable(o, self)
self.__index = self
self.length = length or 0
self.breadth = breadth or 0
self.area = length*breadth;
return o
end
-- 派生类的方法 printArea
function Rectangle:printArea ()
print("矩形面积为 ",self.area)
end
4.オブジェクトを作成する
オブジェクトの作成は、クラスのインスタンスにメモリを割り当てるプロセスです。各クラスには独自のメモリがあり、共通のデータを共有します。
r = Rectangle:new(nil,10,20)
5. プロパティにアクセスする
ドット (.) を使用して、クラスのプロパティにアクセスできます。
print(r.length)
6. メンバー関数にアクセスする
コロン : を使用して、クラスのメンバー関数にアクセスできます。
r:printArea()
オブジェクトの初期化時にメモリが割り当てられます。
7. 初期化、完全な例
-- 元类
Shape = {area = 0}
-- 基础类方法 new
function Shape:new (o,side)
o = o or {}
setmetatable(o, self)
self.__index = self
side = side or 0
self.area = side*side;
return o
end
-- 基础类方法 printArea
function Shape:printArea ()
print("面积为 ",self.area)
end
-- 创建对象
myshape = Shape:new(nil,10)
myshape:printArea()
面積は100
8. Lua の継承
継承とは、あるオブジェクトが別のオブジェクトのプロパティとメソッドを直接使用することです。基本クラスを拡張するために使用できるプロパティとメソッド。
以下は、継承の簡単な例を示しています。
-- Meta class
Shape = {area = 0}
-- 基础类方法 new
function Shape:new (o,side)
o = o or {}
setmetatable(o, self)
--由于返回的是基类o,所以要设定__index,访问基类找不到就找子类
self.__index = self
side = side or 0
self.area = side*side;
return o
end
-- 基础类方法 printArea
function Shape:printArea ()
print("面积为 ",self.area)
end
次の例では、Square オブジェクトが Shape クラスを継承しています。
Square = Shape:new()
-- Derived class method new
function Square:new (o,side)
o = o or Shape:new(o,side)
setmetatable(o, self)
self.__index = self
return o
end
9. 継承、完全な例
次の例では、単純なクラスを継承して派生クラスのメソッドを拡張し、派生クラスは継承されたクラスのメンバー変数とメソッドを保持します。
-- Meta class
Shape = {area = 0}
-- 基础类方法 new
function Shape:new (o,side)
o = o or {}
setmetatable(o, self)
self.__index = self
side = side or 0
self.area = side*side;
return o
end
-- 基础类方法 printArea
function Shape:printArea ()
print("面积为 ",self.area)
end
-- 创建对象
myshape = Shape:new(nil,10)
myshape:printArea()
Square = Shape:new()
-- 派生类方法 new
function Square:new (o,side)
o = o or Shape:new(o,side)
setmetatable(o, self)
self.__index = self
return o
end
-- 派生类方法 printArea
function Square:printArea ()
print("正方形面积为 ",self.area)
end
-- 创建对象
mysquare = Square:new(nil,10)
mysquare:printArea()
Rectangle = Shape:new()
-- 派生类方法 new
function Rectangle:new (o,length,breadth)
o = o or Shape:new(o)
setmetatable(o, self)
self.__index = self
self.area = length * breadth
return o
end
-- 派生类方法 printArea
function Rectangle:printArea ()
print("矩形面积为 ",self.area)
end
-- 创建对象
myrectangle = Rectangle:new(nil,10,20)
myrectangle:printArea()
上記のコードを実行すると、出力は次のようになります。
面積 100 の 面積 面積 100 の 正方形 面積 200 の長方形
10. 関数書き換え
Lua では、基本クラスの関数を書き直して、派生クラスで独自の実装を定義できます。
-- 派生类方法 printArea
function Square:printArea ()
print("正方形面积 ",self.area)
end