Latest web development tutorials

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