При визначенні функцій-членів в таблиці-прототипі можна використовувати запис через двокрапку
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(), "г в день")4>
cats={} for i=1,10,1 do cats[i]={ves=i} padd(cats[i]) print("для ваги", i, "кг") print(cats[i].kolvo()) end
Немає коментарів:
Дописати коментар