Luaオブジェクト指向
オブジェクト指向プログラミング (OOP) は、非常に人気のあるコンピューター プログラミング アーキテクチャです。
次のプログラミング言語はオブジェクト指向プログラミングをサポートしています:
C++
Java
Objective-C
Smalltalk
-
C#
Ruby
オブジェクト指向の機能
1) カプセル化: エンティティの情報、機能、応答を別のオブジェクトにロードできる機能を指します。
2) 継承: 継承方式により、元のプログラムを変更せずに拡張できるため、元の機能を保持し、新しい機能を拡張できます。これにより、コーディングの繰り返しが減り、ソフトウェア開発効率が向上します。
3) ポリモーフィズム: 同じ操作が異なるオブジェクトに作用し、異なる解釈を持ち、異なる実行結果を生成する可能性があります。実行時に、基本クラスへのポインターを介して派生クラスのメソッドを呼び出すことができます。
4) 抽象化: 抽象化は、複雑な現実の問題を単純化する方法であり、特定の問題に対して最も適切なクラス定義を見つけ、最も適切な継承レベルで問題を説明できます。
Lua のオブジェクト指向
オブジェクトがプロパティとメソッドで構成されていることはわかっています。 LUA の最も基本的な構造はテーブルであるため、オブジェクトのプロパティを記述するにはテーブルを使用する必要があります。
lua の関数を使用してメソッドを表すことができます。その後、テーブル + 関数を通じて LUA のクラスをシミュレートできます。
継承に関しては、metetable を通じてシミュレートできます (推奨されません。ほとんどの場合、最も基本的なオブジェクトをシミュレートするだけで十分です)。
Lua のテーブルは、ある意味で単なるオブジェクトではありません。オブジェクトと同様に、テーブルにも状態 (メンバー変数) があり、特に、2 つの異なる値を持つオブジェクト (テーブル) は 2 つの異なるオブジェクトを表すことができます。値も、異なる時点で異なる値を持ちますが、テーブルは常にオブジェクトと同様であり、テーブルのライフサイクルは、テーブルの作成元や作成場所とは関係がありません。オブジェクトにはメンバー関数があり、テーブルにも次のものがあります:
Account = {balance = 0} function Account.withdraw (v) Account.balance = Account.balance - v end
この定義は新しい関数を作成し、それを Account オブジェクトのdrawingフィールドに保存します。以下のように呼び出すことができます:
Account.withdraw(100.00)
単純なインスタンス
以下。 simple クラスには次の 3 つの属性が含まれます: area、length、width の計算結果を出力するために printArea メソッドが使用されます:
-- Meta class Rectangle = {area = 0, length = 0, breadth = 0} -- 派生类的方法 new 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
オブジェクトの作成
オブジェクトの作成は、ビット クラスのインスタンスにメモリを割り当てるプロセスです。各クラスは独自のメモリを持ち、共通のデータを共有します。
r = Rectangle:new(nil,10,20)
属性にアクセスする
ドット (.) を使用してクラスの属性にアクセスできます:
print(r.length)
メンバー関数にアクセスします
コロン (:) を使用してクラスの属性にアクセスできます:
r:printArea()
メモリはオブジェクトの初期化時に保存されます。
完全な例
以下に、Lua オブジェクト指向の完全な例を示します:
-- 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()
上記のプログラムを実行すると、出力結果は次のようになります:
面积为 100
Lua の継承
継承とは、あるオブジェクトが別のオブジェクトのプロパティとメソッドを直接使用することを意味します。基本クラスを拡張するために使用できるプロパティとメソッド。
以下は単純な継承の例を示しています:
-- 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
次の例では、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
完全な例
次の例では、単純なクラスを継承して派生クラスのメソッドを拡張します。 , 継承されたクラスのメンバー変数とメソッドは派生クラスに保持されます:
-- 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
関数の書き換え
Luaでは、基底クラスの関数を書き換えることができますそして、派生クラスの実装メソッドで自分自身を定義します:
-- 派生类方法 printArea function Square:printArea () print("正方形面积 ",self.area) end