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

Lua 面向对象

Objektorientierte Programmierung (Object Oriented Programming, OOP) ist eine sehr beliebte Computerprogrammarchitektur.

Die folgenden Programmiersprachen unterstützen alle die objektorientierte Programmierung:

  • C++

  • Java

  • Objective-C

  • Smalltalk

  • C#

  • Ruby

Orientierte Objektmerkmale

  • 1Kapselung: Es bezieht sich auf die Eigenschaft, Informationen, Funktionen und Antworten eines Gegenstands in einen单独en Objekt einzufügen.

  • 2Vererbung: Die Methode der Vererbung ermöglicht es, das Programm ohne Änderungen an der ursprünglichen Version zu erweitern, so dass die ursprüngliche Funktion erhalten bleibt und die neue Funktion erweitert wird. Dies ist vorteilhaft für die Reduzierung von Redundanz und die Erhöhung der Effizienz der Softwareentwicklung.

  • 3Polymorphie: Die gleiche Operation wird auf verschiedene Objekte angewendet und kann unterschiedliche Interpretationen und verschiedene Ausführungsresultate erzeugen. Während der Laufzeit kann durch einen Zeiger auf die Basisklasse eine Methode in der abgeleiteten Klasse aufgerufen werden.

  • 4Abstraktion: Abstraktion (Abstraction) ist ein Weg, komplexe realistische Probleme zu vereinfachen, und sie kann die am besten geeignete Klassendefinition für spezifische Probleme finden und das Problem auf der am besten geeigneten Vererbungsebene erklären.

Orientiert auf Lua

Wir wissen, dass Objekte aus Eigenschaften und Methoden bestehen. Das grundlegendste Strukturmodell in LUA ist die Tabelle, daher muss die Tabelle verwendet werden, um die Eigenschaften des Objekts zu beschreiben.

In Lua können Funktionen als Methoden verwendet werden. Daher können die Klassen in LUA durch Tabelle dargestellt werden + function simuliert werden.

Was das Erben betrifft, kann es durch die Metatabelle simuliert werden (nicht empfohlen, nur um die grundlegenden Objekte zu simulieren, reicht es in den meisten Fällen aus).

Tabellen in Lua sind in gewisser Weise auch Objekte. Wie Objekte haben Tabellen Zustände (Mitgliedsvariablen); sie haben auch eine unabhängige Natur, insbesondere wenn zwei verschiedene Werte ein Objekt (Tabelle) darstellen, das zwei verschiedene Objekte sind; ein Objekt kann zu verschiedenen Zeiten auch verschiedene Werte haben, aber es bleibt stets ein Objekt; wie Objekte haben auch Tabellen ihren Lebenszyklus, der nichts damit zu tun hat, was und wo sie erstellt wurden. Objekte haben ihre Memberfunktionen, und Tabellen auch:

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

Diese Definition erstellt eine neue Funktion und speichert sie im Bereich withdraw des Account-Objekts. Wir können es wie folgt aufrufen:

Account.withdraw (100.00)

Ein einfaches Beispiel

Im folgenden einfachen Beispiel sind drei Eigenschaften enthalten: area, laenge und breite, die Methode printArea wird verwendet, um das Berechnungsergebnis anzuzeigen:

-- Metaklasse
Rectangle = {area = 0, laenge = 0, breite = 0}
-- Methode der Ableitungsklasse new
function Rectangle:new (o,length,breadth)
  o = o or {}
  setmetatable(o, self)
  self.__index = self
  self.laenge = laenge or 0
  self.breite = breite or 0
  self.area = length*breite;
  return o
end
-- Methode der Ableitungsklasse printArea
function Rectangle:printArea ()
  print("矩形面积为 ",self.area)
end

创建对象

Die Erstellung eines Objekts ist der Prozess der Zuweisung von Speicher für das Beispiel der Klasse. Jede Klasse hat ihren eigenen Speicher und teilt die gemeinsamen Daten.

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

Zugriff auf Eigenschaft

Wir können den Punkt . verwenden, um auf die Eigenschaften der Klasse zuzugreifen:

print(r.laenge)

Zugriff auf Memberfunktion

Wir können den Doppelpunkt : verwenden, um auf die Memberfunktionen der Klasse zuzugreifen:

r:printArea ()

Speicher wird beim Initialisieren des Objekts zugewiesen.

Vollständiges Beispiel

Im Folgenden zeigen wir einen vollständigen Beispiel von Lua mit objektorientierter Programmierung:

-- Metaklasse
Shape = {area = 0}
-- Grundklasse Methode new
function Shape:new (o, seite)
  o = o or {}
  setmetatable(o, self)
  self.__index = self
  seite = seite or 0
  self.area = seite*seite;
  return o
end
-- Grundklasse Methode printArea
function Shape:printArea ()
  print("面积为 ",self.area)
end
-- 创建对象
myshape = Shape:new(nil,10)
myshape:printArea()

Führe den obigen Code aus, und das Ausgabergebnis ist:

面积为     100

Lua Vererbung

Vererbung bezieht sich auf die direkte Verwendung der Eigenschaften und Methoden eines anderen Objekts. Es kann verwendet werden, um die Eigenschaften und Methoden der Grundklasse zu erweitern.

Im folgenden Beispiel wird ein einfaches Vererbungsbeispiel gezeigt:

-- Metaklasse
Shape = {area = 0}
-- Grundklasse Methode new
function Shape:new (o, seite)
  o = o or {}
  setmetatable(o, self)
  self.__index = self
  seite = seite or 0
  self.area = seite*seite;
  return o
end
-- Grundklasse Methode printArea
function Shape:printArea ()
  print("面积为 ",self.area)
end

Im folgenden Beispiel wird der Square-Objekt die Klasse Shape vererbt:

Square = Shape:new()
-- Methode der Ableitungsklasse new
function Square:new (o,side)
  o = o or Shape:new(o,side)
  setmetatable(o, self)
  self.__index = self
  return o
end

Vollständiges Beispiel

Im folgenden Beispiel erweitern wir eine einfache Klasse, um Methoden der Ableitungsklasse hinzuzufügen, die die Membervariablen und Methoden der vererbten Klasse beibehalten:

-- Metaklasse
Shape = {area = 0}
-- Grundklasse Methode new
function Shape:new (o, seite)
  o = o or {}
  setmetatable(o, self)
  self.__index = self
  seite = seite or 0
  self.area = seite*seite;
  return o
end
-- Grundklasse Methode 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