English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

البرمجة الموجهة للأ象 في Lua

برمجة الأشياء (Object Oriented Programming، OOP) هي بنية برمجية شائعة جدًا في برمجة الحواسيب.

تدعم جميع أنواع البرمجة التالية برمجة الأشياء:

  • C++

  • Java

  • Objective-C

  • Smalltalk

  • C#

  • Ruby

خصائص برمجة الأشياء

  • 1) التجميع: تشير إلى الخاصية التي تتيح وضع معلومات، وظائف، وردود على شيء واحد.

  • 2) الوراثة: تسمح طرق الوراثة بتوسيع البرنامج دون تغييره، مما يحافظ على الوظيفة الأصلية ويوسع الوظيفة الجديدة. هذا يساعد في تقليل التكرار في الكود وزيادة كفاءة تطوير البرمجيات.

  • 3) التعددية: يمكن أن تكون نفس العملية مفعولة على أشياء مختلفة، مما يؤدي إلى تفسيرات مختلفة وإلى نتائج تنفيذية مختلفة. في الوقت التشغيل، يمكن استدعاء الوظائف في الفئة الفرعية من خلال إشارة إلى إشارة الفئة الأصلية.

  • 4) التجريد: التجريد (Abstraction) هو وسيلة لتسوية المشاكل المعقدة، ويمكنه العثور على تعريف الفئة الأكثر ملاءمة للمشكلة المحددة، ويمكنه تفسير المشكلة في مستوى الوراثة الأكثر ملاءمة.

برمجة Lua قائمة بالأشياء

نحن نعلم أن الأشياء تتكون من الخصائص والوظائف. هيكل أساسي في LUA هو الجدول، لذا نحتاج إلى استخدام الجدول لوصف خصائص الأشياء.

يمكن استخدام function في Lua لتمثيل الطريقة. لذلك يمكن محاكاة الفئات في LUA من خلال الجداول + function.

فيما يتعلق بالوراثة، يمكن محاكاة من خلال metatable (غير موصى به، فقط محاكاة الأشياء الأساسية كافية في معظم الوقت).

في Lua، الجداول ليست فقط نوعًا من الأشياء. مثل الأشياء، الجداول لها حالة (مغيرات العضوية);ولديها طبيعة مستقلة عن قيمة الأشياء، خاصةً عندما يمثل كل من الجداول ذوي القيم المختلفة أشياء مختلفة؛ يمكن أن يكون لشيء قيمته مختلفة في أوقات مختلفة، ولكنه دائمًا شيء؛مثل الأشياء، يوجد لديها دورة حياة لا علاقة لها بما أنشأها أو أين أنشأها.للأشياء وظائف أعضاء، وللجداول أيضًا:

Account = {balance = 0}
function Account.withdraw (v)
    Account.balance = Account.balance - v
end

这个定义创建了一个新的函数,并且保存在Account对象的withdraw域内,下面我们可以这样调用:

Account.withdraw(100.00)

一个简单示例

以下简单的类包含了三个属性: area, length 和 breadth,printArea方法用于打印计算结果:

-- 元类
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 面向对象的完整示例:

-- 元类
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