Bài 21 : Lua – Hướng đối tượng

Bài 21 : Lua – Hướng đối tượng

Lua – Hướng đối tượng  Trang trướcTrang tiếp theo   Giới thiệu về OOP Lập trình hướng đối tượng (OOP), là […]

Learn more »

Lua – Hướng đối tượng


 Trang trướcTrang tiếp theo  

Giới thiệu về OOP

Lập trình hướng đối tượng (OOP), là một trong những kỹ thuật lập trình được sử dụng nhiều nhất trong thời đại lập trình hiện đại. Có một số ngôn ngữ lập trình hỗ trợ OOP, bao gồm,

  • C ++
  • Java
  • Objective-C
  • Smalltalk
  • NS#
  • Ruby

Đặc điểm của OOP

  • Lớp – Lớp là một khuôn mẫu có thể mở rộng để tạo các đối tượng, cung cấp các giá trị ban đầu cho trạng thái (các biến thành viên) và triển khai hành vi.
  • Đối tượng – Nó là một thể hiện của lớp và có bộ nhớ riêng được cấp phát cho chính nó.
  • Kế thừa – Là một khái niệm mà các biến và hàm của một lớp này được kế thừa bởi một lớp khác.
  • Đóng gói – Đây là quá trình kết hợp dữ liệu và các chức năng bên trong một lớp. Dữ liệu có thể được truy cập bên ngoài lớp với sự trợ giúp của các hàm. Nó còn được gọi là trừu tượng hóa dữ liệu.

OOP trong Lua

Bạn có thể triển khai hướng đối tượng trong Lua với sự trợ giúp của bảng và các hàm lớp đầu tiên của Lua. Bằng cách đặt các chức năng và dữ liệu liên quan vào một bảng, một đối tượng được hình thành. Kế thừa có thể được thực hiện với sự trợ giúp của các bảng đo lường, cung cấp cơ chế tra cứu các hàm (phương thức) và trường không tồn tại trong (các) đối tượng mẹ.

Các bảng trong Lua có các tính năng của đối tượng như trạng thái và danh tính độc lập với các giá trị của nó. Hai đối tượng (bảng) có cùng giá trị là các đối tượng khác nhau, ngược lại một đối tượng có thể có giá trị khác nhau tại các thời điểm khác nhau, nhưng nó luôn là cùng một đối tượng. Giống như các đối tượng, các bảng có một vòng đời độc lập với việc ai đã tạo ra chúng hoặc nơi chúng được tạo ra.

Một ví dụ về thế giới thực

Khái niệm hướng đối tượng được sử dụng rộng rãi nhưng bạn cần hiểu rõ về nó để có lợi ích tối đa và phù hợp.

Chúng ta hãy xem xét một ví dụ toán học đơn giản. Chúng tôi thường gặp những tình huống khi chúng tôi làm việc trên các hình dạng khác nhau như hình tròn, hình chữ nhật và hình vuông.

Các hình dạng có thể có một Khu vực thuộc tính chung. Vì vậy, chúng ta có thể mở rộng các hình dạng khác từ hình dạng đối tượng cơ sở với vùng thuộc tính chung. Mỗi hình dạng có thể có các thuộc tính và chức năng riêng của nó như một hình chữ nhật có thể có các thuộc tính chiều dài, chiều rộng, diện tích là thuộc tính của nó và printArea và mathArea là các chức năng của nó.

Tạo một lớp học đơn giản

Cách triển khai lớp đơn giản cho một hình chữ nhật có ba thuộc tính diện tích, chiều dài và chiều rộng được hiển thị bên dưới. Nó cũng có chức năng printArea để in diện tích được tính toán.

-- Meta class Rectangle = {area = 0, length = 0, breadth = 0}  -- Derived class method 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  -- Derived class method printArea  function Rectangle:printArea ()    print("The area of Rectangle is ",self.area) end

Tạo một đối tượng

Tạo một đối tượng là quá trình cấp phát bộ nhớ cho cá thể lớp. Mỗi đối tượng có bộ nhớ riêng và chia sẻ dữ liệu lớp chung.

r = Rectangle:new(nil,10,20) 

Truy cập thuộc tính

Chúng ta có thể truy cập các thuộc tính trong lớp bằng toán tử dấu chấm như hình dưới đây:

print(r.length) 

Truy cập chức năng thành viên

Bạn có thể truy cập một hàm thành viên bằng cách sử dụng toán tử dấu hai chấm với đối tượng như hình dưới đây:

r:printArea() 

Bộ nhớ được cấp phát và các giá trị ban đầu được đặt. Quá trình khởi tạo có thể được so sánh với các hàm tạo trong các ngôn ngữ hướng đối tượng khác. Nó không là gì khác ngoài một chức năng cho phép thiết lập các giá trị như hình trên.

Hoàn thành ví dụ

Hãy xem một ví dụ hoàn chỉnh bằng cách sử dụng hướng đối tượng trong Lua.Bản thử trực tiếp

-- Meta class Shape = {area = 0}  -- Base class method 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  -- Base class method printArea  function Shape:printArea ()    print("The area is ",self.area) end  -- Creating an object myshape = Shape:new(nil,10)  myshape:printArea()

Khi bạn chạy chương trình trên, bạn sẽ nhận được kết quả sau.

The area is 	100 

Thừa kế trong Lua

Kế thừa là quá trình mở rộng các đối tượng cơ sở đơn giản như hình dạng thành hình chữ nhật, hình vuông, v.v. Nó thường được sử dụng trong thế giới thực để chia sẻ và mở rộng các thuộc tính và chức năng cơ bản.

Hãy cho chúng tôi xem một phần mở rộng lớp đơn giản. Chúng tôi có một lớp học như hình dưới đây.

-- Meta class Shape = {area = 0}  -- Base class method 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  -- Base class method printArea  function Shape:printArea ()    print("The area is ",self.area) end

Chúng ta có thể mở rộng hình dạng thành một lớp vuông như hình dưới đây.

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

Các chức năng cơ sở vượt quá giới hạn

Chúng ta có thể ghi đè các hàm của lớp cơ sở thay vì sử dụng hàm trong lớp cơ sở, lớp dẫn xuất có thể có triển khai riêng của nó như được hiển thị bên dưới:

-- Derived class method printArea  function Square:printArea ()    print("The area of square is ",self.area) end

Ví dụ hoàn chỉnh về thừa kế

Chúng ta có thể mở rộng việc triển khai lớp đơn giản trong Lua như được hiển thị ở trên với sự trợ giúp của một phương thức mới khác với sự trợ giúp của các bảng đo lường. Tất cả các biến thành viên và hàm của lớp cơ sở được giữ lại trong lớp dẫn xuất.Bản thử trực tiếp

-- Meta class Shape = {area = 0}  -- Base class method 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  -- Base class method printArea  function Shape:printArea ()    print("The area is ",self.area) end  -- Creating an object myshape = Shape:new(nil,10) myshape:printArea()  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  -- Derived class method printArea  function Square:printArea ()    print("The area of square is ",self.area) end  -- Creating an object mysquare = Square:new(nil,10) mysquare:printArea()  Rectangle = Shape:new()  -- Derived class method 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  -- Derived class method printArea  function Rectangle:printArea ()     print("The area of Rectangle is ",self.area) end  -- Creating an object  myrectangle = Rectangle:new(nil,10,20) myrectangle:printArea()

Khi chúng tôi chạy chương trình trên, chúng tôi sẽ nhận được kết quả sau:

The area is 	100 The area of square is 	100 The area of Rectangle is 	200 

Trong ví dụ trên, chúng ta đã tạo hai lớp dẫn xuất – Hình chữ nhật và Hình vuông từ Lớp cơ sở Square. Có thể ghi đè các chức năng của lớp cơ sở trong lớp dẫn xuất. Trong ví dụ này, lớp dẫn xuất sẽ ghi đè hàm printArea.


Lượt xem : 227

Integrations
Users

Share Profile

Anyone at KeenThemes can view
Anyone with link can edit

Give Award

Anyone at KeenThemes can view
Anyone with link can edit

Report User

Let us know why you’re reporing this person
Don't worry, your report is completely anonymous; the person you're
reporting will not be informed that you've submitted it