Luaのオブジェクト指向します
OOP(オブジェクト指向プログラミング、OOP)は非常に人気のあるコンピュータプログラミングアーキテクチャです。
以下のプログラミング言語はオブジェクト指向プログラミングをサポートしています。
- C ++
- ジャワ
- Objective-Cの
- Smalltalkの
- C#の
- ルビー
オブジェクト指向機能
- 1)パッケージ:情報、関数の実体の能力を意味すると応答は別のオブジェクトのプロパティに入れています。
- 2)継承:継承されたメソッドは、元の関数を保存することができ、新しい機能も拡張されて、そのようなことは、その拡大に元のプログラムの基礎を変更しないことができます。 これは、ソフトウェアの開発効率を向上させるために、反復的な符号化を低減するのに役立ちます。
- 3)多型:別のオブジェクトに適用される同様の動作が異なる実行結果をもたらす、異なる解釈を有していてもよいです。 実行時に、あなたは、派生クラスのメソッドを呼び出すために、基本クラスのポインタを指すことができます。
- 4)要約:抽象(抽象)は道の複雑な現実を単純化することであり、それが最も適切なカテゴリが特定の問題のように定義され、最も適切なレベルの継承の解釈であってもよい見つけることができます。
Luaのオブジェクト指向します
我々は、オブジェクトのプロパティとメソッドの構図ことを知っています。 LUAは、最も基本的な構造のテーブルで、オブジェクトのプロパティを記述するためにテーブルを使用する必要があります。
LUA機能を表現するために使用することができます。 このクラスは、次いで、LUAテーブル+関数をシミュレートすることができます。
相続に関しては(十分な時間のほとんど唯一の最も基本的なオブジェクトをシミュレートすることはお勧めできません)metetableによってシミュレートすることができます。
Luaのテーブルだけでなく、ある意味で、オブジェクトです。 オブジェクトと同様に、この表には、状態(メンバ変数)を持っています。また、自然のオブジェクトの独立の値で、特に異なる値の二つのオブジェクト(テーブル)を有するものが2つの異なるオブジェクトを表し、異なる時間にオブジェクトが異なる場合があります値が、彼は常にオブジェクトとなっている。目的は何の関係が作成されていない中でどのようなライフサイクルによって作成されたテーブルに似ています。 オブジェクトは、そのメンバ関数を持って、テーブルもあります。
Account = {balance = 0} function Account.withdraw (v) Account.balance = Account.balance - v end
この定義は、新しい関数を作成し、Accountオブジェクト内撤回保存され、我々は次のように呼び出すことができます。
Account.withdraw(100.00)
簡単な例
印刷結果のための面積、長さ、幅、printAreaと方法:次の簡単なクラスには、3つのプロパティが含まれています。
-- 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: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