English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
برمجة الأشياء (Object Oriented Programming، OOP) هي بنية برمجية شائعة جدًا في برمجة الحواسيب.
تدعم جميع أنواع البرمجة التالية برمجة الأشياء:
C++
Java
Objective-C
Smalltalk
C#
Ruby
1) التجميع: تشير إلى الخاصية التي تتيح وضع معلومات، وظائف، وردود على شيء واحد.
2) الوراثة: تسمح طرق الوراثة بتوسيع البرنامج دون تغييره، مما يحافظ على الوظيفة الأصلية ويوسع الوظيفة الجديدة. هذا يساعد في تقليل التكرار في الكود وزيادة كفاءة تطوير البرمجيات.
3) التعددية: يمكن أن تكون نفس العملية مفعولة على أشياء مختلفة، مما يؤدي إلى تفسيرات مختلفة وإلى نتائج تنفيذية مختلفة. في الوقت التشغيل، يمكن استدعاء الوظائف في الفئة الفرعية من خلال إشارة إلى إشارة الفئة الأصلية.
4) التجريد: التجريد (Abstraction) هو وسيلة لتسوية المشاكل المعقدة، ويمكنه العثور على تعريف الفئة الأكثر ملاءمة للمشكلة المحددة، ويمكنه تفسير المشكلة في مستوى الوراثة الأكثر ملاءمة.
نحن نعلم أن الأشياء تتكون من الخصائص والوظائف. هيكل أساسي في 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
继承是指一个对象直接使用另一对象的属性和方法。可用于扩展基础类的属性和方法。
以下演示了一个简单的继承示例:
-- 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