Шукати в цьому блозі

Об'єктно-орієнтоване програмування (ООП) на Lua




При визначенні функцій-членів в таблиці-прототипі можна використовувати запис через двокрапку

function <Ім'я_таблиці>:<Ім'я_методу>( <Аргументи> )

Яка еквівалентна формі запису

function <Ім'я_таблиці>.<Ім'я_методу>( self, <Аргументи> )

Виклик методів також може виконуватися в двох еквівалентних формах:

<Імя_об'екту>:<Ім'я_методу>( <Аргументи> )
<Імя_об'екту>.<Ім'я_методу>( <Імя_об'екту>, <Аргументи> )

Все, що було сказано про реалізацію ООП за допомогою Lua, можна проілюструвати невеликим прикладом:

MyAccount =
{
  balance = 5000,
  operations = function ( self, deposit, expense )
    self.balance = self.balance + deposit - expense
    print( "твій баланс: " .. self.balance )
  end
}

MyAccount.operations( MyAccount, 500, 300 )
MyAccount.balance = 5000
MyAccount:operations( 500, 300 )

Тут метод включений в таблицю об'єкта, тому викликати його можна в обох формах - і 'через точку', і 'через двокрапку'.


Ще приклади з котами:

cats={main="Хижаки, Ссавці", food="Риба, м'ясо"}
h_cats={}
h_cats.main=cats.main
h_cats.food=cats.food
--Додаємо нову властивість
h_cats.address="квартира"
print(h_cats.food, h_cats.address)

cats={main="Хижаки, Ссавці", food="Риба, м'ясо"}
h_cats=cats
h_cats.address="квартира"
print(cats.address)

cats={main="Хижаки, Ссавці", food="Риба, м'ясо"}
h_cats={cats=cats, address="квартира"}
print(h_cats.cats.main,cats.food)

Конструктор

function padd(fname)
   fname.food="сгущонка"
   fname.phone="+375296"
   --и так далі
end

--Все готово. ця функція-конструктор  Додає властивості-поля food і phoneВ будь-яку з таблиць. Викликається просто, наприклад:

h_cats={}
padd(h_cats)

Отже, у нас є об'єкт (можемо сприймати його як клас) cat, а по суті, кіт, в раціон харчування якого ми вирішили додати сухий корм. Але при цьому нам потрібно розрахувати кількість на день. Якщо розглянути таблиці на пачках з «Кітікет», то очевидно, що ця величина розраховується як «вага кішки * 20 г» для кішок до 4 кг, і «вага кішки * 20 г + 5 г» для 4 кг і більше.

function padd(fname)
   fname.new_food="сухий корм"
   if fname.ves<4 span=""> then
      function kolvo() return fname.ves*20
      end
   else
      function kolvo() return fname.ves*20+5
      end
   end
   fname.kolvo=kolvo
end

   cat={ves=3}
   padd(cat)
   print(cat.new_food)
   print(cat.kolvo(), "г в день")

cats={}
for i=1,10,1 do
   cats[i]={ves=i}
   padd(cats[i])
   print("для ваги", i, "кг")
   print(cats[i].kolvo())
end






























Немає коментарів:

Дописати коментар