Luaのオブジェクト指向 - 開発シリーズ23 openresty

開発シリーズ23 openresty - Luaのオブジェクト指向の

オブジェクト指向プログラミング(オブジェクト指向プログラミング、OOP)非常に人気のコンピュータプログラミングアーキテクチャです。
Java(登録商標)、C ++、ネットオブジェクト指向支持できる。

のオブジェクト指向機能
1)パッケージ:エンティティ、機能の情報を参照し、応答特性を別のオブジェクトに充電されています。
2)継承:継承されたメソッドは、それが、本来の機能が維持されるように、元のプログラムの変更なしに基づいて展開されることを可能にする
    新しい機能も拡張されています。これは、ソフトウェア開発の効率を向上させるために、反復的なコーディングを減らすのに役立ちます。
3)多型:同じ操作異なるオブジェクトに適用されるが、異なる解釈を有する異なる実行結果を生成することができます。実行時に、
    基本クラスへのポインタにより、派生クラスは、メソッドの実装を呼び出します。
4)要約:抽象(抽象化)方法の複雑な現実を単純化することであり、それは最も適切なクラスは、特定の問題のように定義されて見つけることができ、
    そして問題は、継承の説明の中で最も適切なレベルであってもよいです。

A)指向Luaのオブジェクト
、オブジェクトのプロパティおよびメソッド組成物は、LUAは、オブジェクト指向のオブジェクトテーブル、関数表現の特性を記述するために使用される
クラステーブルでLUA +関数をシミュレートすることができます。

簡単な例
クラス2つのプロパティ含ま、単純な矩形クラスを表す:長さおよび幅を、領域のサイズ得るためのgetArea方法

新しいスクリプトはrect.lua

ローカル長さ= RECT = {0、0} =幅

-派生クラスの新しいです
RECT関数:新規新しい(長さ、幅)
  ローカルO = {
     -各項目の値を設定
     長さ= 0または長さ、
     幅または幅= 0
  }
  setmetatable(O、自己} = {__index)
  リターンO
エンド

-派生クラスgetAreaの方法
関数RECT:のgetArea()
  の戻りself.length * self.width
エンド

戻りRECT

----------------- ---------- test.lua --------------

参照モジュール
ローカルRECTは=(「RECT」を必要とする )

オブジェクトの作成
オブジェクトは、クラスのインスタンスのために割り当てられたプロセスのメモリで作成します。各クラスは、独自のメモリを持ち、共通のデータを共有しています。

RECT1 = RECTローカル:新新(10,20)
ローカルRECT2 = RECT:新新(5,6)

アクセス属性---- "rect1.length
アクセスメンバ関数----" RECT1:のgetArea()

印刷(「長さ1 :」、rect1.length)。
プリント( "エリア1:"、RECT1:のgetArea( )); --- ポイントコール番号とコロンコースの前に導入された
プリント( "長さ2"、rect2.length);
プリント( "領域2"、RECT2。 getArea());


2)は、Luaの継承

------------------- -------------------基本クラス形状を--------

局所形状= {名称= ""}

-エンティティオブジェクトのメソッドに新しい新規作成
関数形状:新しい新しい(名前)
  ローカルO = {
    名称=名または"形状"
  }
  setmetatable(O、= {__indexを}自己)
  リターンO
エンド

- getPerimeter用の円周得る方法
関数形状を:getPerimeter()
  プリント(「形状にgetPerimeter」);
  0を返す
エンド

-のgetAreaの面積求める方法
関数形状を:のgetArea()
  プリント(「のgetAreaで形状「);
  戻り0


関数形状:getVum()
  印刷(「getVum形で」);
  戻り値0
エンド

Shapeを返し

トライアングルクラスを継承しました---------------------- ----------- -----------------

局所形状=(「形状」)を必要とする

ローカル・トライアングル} = {

-派生クラスのメソッド新しい新しい
機能トライアングル:新しい新しい(名前、A1、A2、A3 )
  ローカルOBJ =形状:新新(名);
 
  サブクラス短い時間で--1)クエリメソッド、見つけるために、親クラスに行きます。
  super_mt = getmetatableローカル(OBJ);
  setmetatable(セルフ、super_mt);
 
  --2)親要素割当テーブルスーパーオブジェクト
  obj.super = setmetatable({}、super_mt)
 
  --- 3)属性割り当て
  obj.a1 = A1 0又は;
  obj.a2またはA2 = 0;
  obj.a3またはA3 = 0;
 
  setmetatable(OBJ、__index =自己{})
 
  戻りOBJ;
エンド

-派生クラスのメソッドgetPerimeter
関数三角形:getPerimeter()
  プリント( "三角形でgetPerimeter")。
  リターン(self.a1 + self.a2 + self.a3)。
エンド

-派生类的方法getHalfPerimeter
機能三角形:getHalfPerimeter()
  プリント( "三角形でgetHalfPerimeter")。
  リターン(self.a1 + self.a2 + self.a3)/ 2


戻り三角形

------------------試験------------ -----------

ローカルRECT =必要とする( "RECT")
--local形状=必要とする( "形状")
ローカル三角形=必要とする( "三角形")
 
ローカルRECT1 = RECT:新規の(10,20 )
ローカルRECT2 = RECT:新しい(5,6)

--local shape1 =形状:新しいです();

ローカルtriangle1 =三角形:新規( "T1"、1,2,3)
ローカルtriangle2 =三角形:新規( "T2"、

印刷( "长度1:"、rect1.length)。
印刷( "面积1:"、RECT1:のgetArea());
印刷( "===============");
印刷( "长度2:"、rect2.length)。
印刷( "面积2:"、RECT2:のgetArea());
印刷( "===============");
--print( "shape1 getPerimeter:"、shape1:getPerimeter())
プリント( "===============")。
----覆盖了形状的に方法の
プリント( "T1のgetPerimeter:"、triangle1:getPerimeter())
プリント( "T1のgetHalfPerimeter:"、triangle1:getHalfPerimeter())

プリント( "T2のgetPerimeter:"、triangle2:getPerimeter() )
プリント( "T2のgetHalfPerimeter:"、triangle2:getHalfPerimeter())

----从形状继承的getVum方法
プリント( "T1のgetVum:"、triangle1:getVum())
プリント(」

印刷( "T2スーパーgetPerimeter:"、triangle2.super:getPerimeter())

おすすめ

転載: www.cnblogs.com/reblue520/p/11434004.html