Lua - Nesne Yönelimli

OOP'ye Giriş

Nesne Yönelimli Programlama (OOP), modern programlama çağında kullanılan en çok kullanılan programlama tekniğidir. OOP'yi destekleyen, aşağıdakileri içeren bir dizi programlama dili vardır:

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

OOP'nin özellikleri

  • Class - Sınıf, nesneler oluşturmak için genişletilebilir bir şablondur, durum (üye değişkenler) ve davranış uygulamaları için başlangıç ​​değerleri sağlar.

  • Objects - Bir sınıf örneğidir ve kendisi için ayrılmış ayrı belleğe sahiptir.

  • Inheritance - Bir sınıfın değişkenlerinin ve işlevlerinin başka bir sınıf tarafından miras alındığı bir kavramdır.

  • Encapsulation- Bir sınıf içindeki verileri ve fonksiyonları birleştirme işlemidir. Verilere, fonksiyonlar yardımıyla sınıf dışından erişilebilir. Veri soyutlama olarak da bilinir.

Lua'da OOP

Lua'da tablolar ve Lua'nın birinci sınıf fonksiyonları yardımıyla nesne yönelimini uygulayabilirsiniz. Fonksiyonlar ve ilgili veriler bir tabloya yerleştirilerek bir nesne oluşturulur. Kalıtım, üst nesnelerdeki var olmayan işlevler (yöntemler) ve alanlar için bir arama mekanizması sağlayarak metatables yardımı ile uygulanabilir.

Lua'daki tablolar, değerlerinden bağımsız olan durum ve kimlik gibi nesne özelliklerine sahiptir. Aynı değere sahip iki nesne (tablo) farklı nesnelerdir, oysa bir nesne farklı zamanlarda farklı değerlere sahip olabilir, ancak her zaman aynı nesnedir. Nesneler gibi, tabloların da onları kimin yarattığından veya nerede oluşturulduğundan bağımsız bir yaşam döngüsü vardır.

Gerçek Dünya Örneği

Nesne yönelimi kavramı yaygın olarak kullanılmaktadır, ancak uygun ve maksimum fayda için onu açıkça anlamanız gerekir.

Basit bir matematik örneğini ele alalım. Genellikle daire, dikdörtgen ve kare gibi farklı şekiller üzerinde çalıştığımız durumlarla karşılaşıyoruz.

Şekillerin ortak bir özellik Alanı olabilir. Böylece, temel nesne şeklindeki diğer şekilleri ortak özellik alanıyla genişletebiliriz. Şekillerin her biri kendi özelliklerine sahip olabilir ve bir dikdörtgen gibi işlevler uzunluk, genişlik, alan özellikleri olarak ve işlevleri olarak printArea ve calculateArea özelliklerine sahip olabilir.

Basit Bir Sınıf Oluşturmak

Üç özellik alanı, uzunluğu ve genişliği olan bir dikdörtgen için basit bir sınıf uygulaması aşağıda gösterilmiştir. Ayrıca hesaplanan alanı yazdırmak için bir printArea işlevi vardır.

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

Bir Nesne Oluşturmak

Bir nesnenin oluşturulması, sınıf örneği için bellek ayırma işlemidir. Nesnelerin her birinin kendi belleği vardır ve ortak sınıf verilerini paylaşır.

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

Özelliklere Erişim

Aşağıda gösterildiği gibi nokta operatörünü kullanarak sınıftaki özelliklere erişebiliriz -

print(r.length)

Üye İşlevine Erişim

Bir üye işlevine, iki nokta operatörünü kullanarak aşağıda gösterilen nesneyle erişebilirsiniz -

r:printArea()

Hafıza tahsis edilir ve başlangıç ​​değerleri belirlenir. Başlatma süreci, diğer nesne yönelimli dillerdeki kurucularla karşılaştırılabilir. Yukarıda gösterildiği gibi değerlerin ayarlanmasını sağlayan bir işlevden başka bir şey değildir.

Tam Örnek

Lua'da nesne yönelimini kullanarak eksiksiz bir örneğe bakalım.

-- 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()

Yukarıdaki programı çalıştırdığınızda, aşağıdaki çıktıyı alacaksınız.

The area is 	100

Lua'da miras

Kalıtım, şekil gibi basit temel nesneleri dikdörtgenlere, karelere vb. Genişletme işlemidir. Genellikle gerçek dünyada temel özellikleri ve işlevleri paylaşmak ve genişletmek için kullanılır.

Basit bir sınıf uzantısı görelim. Aşağıda gösterildiği gibi bir sınıfımız var.

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

Şekli, aşağıda gösterildiği gibi bir kare sınıfa genişletebiliriz.

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

Aşırı Sürüş Temel İşlevleri

Temel sınıftaki işlevi kullanmak yerine temel sınıf işlevlerini geçersiz kılabiliriz, türetilmiş sınıf aşağıda gösterildiği gibi kendi uygulamasına sahip olabilir -

-- Derived class method printArea

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

Tam Devralma Örneği

Lua'daki basit sınıf uygulamasını, metatables yardımıyla başka bir yeni yöntemin yardımıyla yukarıda gösterildiği gibi genişletebiliriz. Temel sınıfın tüm üye değişkenleri ve işlevleri türetilmiş sınıfta tutulur.

-- 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()

Yukarıdaki programı çalıştırdığımızda aşağıdaki çıktıyı alacağız -

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

Yukarıdaki örnekte, Square temel sınıfından iki türetilmiş sınıf oluşturduk - Dikdörtgen ve Kare. Türetilmiş sınıftaki temel sınıfın işlevlerini geçersiz kılmak mümkündür. Bu örnekte, türetilmiş sınıf, printArea işlevini geçersiz kılar.