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