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.