Lua средний класс. Гарантируется ли, что функции класса будут вызываться вместо одноименных миксинов? - PullRequest
0 голосов
/ 06 мая 2020

Я работаю над проектом, который использует библиотеку среднего класса lua. Мои эксперименты показывают, что если класс включает миксин, который имеет функцию с тем же именем, что и функция класса, то вызов этой функции в экземпляре класса вызовет функцию class , а не mixin function.

Но я не мог понять почему, прочитав код среднего класса. Гарантировано ли поведение или зависит от какого-либо вызова или порядка включения?

EDIT: ниже добавлен минимальный код. Могу ли я положиться на myFoo: show (), отображающий «Foo»?

class = require('middleclass')

-- this is a middleclass mixin, not a class
Bar = {}
function Bar:show()
    print("Bar")
end


-- class Foo implements 'show', and includes 
-- the mixin which also implements 'show'
Foo = class('Foo')
Foo:include(Bar)    

function Foo:show()
    print("Foo")
end


-- class LittleFoo does not implement 'show', 
-- but includes the mixin which implements 'show'
LittleFoo = class('LittleFoo')
LittleFoo:include(Bar)              


-- program
myFoo = Foo:new()
myLittleFoo = LittleFoo:new()

myFoo:show()                -- prints 'Foo'
myLittleFoo:show()          -- prints 'Bar'

1 Ответ

0 голосов
/ 08 мая 2020

Это ожидаемое поведение, вы наследуете метод show от родительского Bar, но у вас есть другая реализация в вашем классе. Это общий стандарт в объектном программировании.

Его нет в коде среднего класса, когда вы выполняете Foo:include(Bar), вы получаете копию списка методов (по ссылкам) из Bar, но когда вы реализуйте метод Foo:show() ... end, затем вы переписываете этот метод, но только для Foo, поэтому в Bar у вас есть старый метод, и когда вы наследуете его от myLittleFoo, вы наследуете старую версию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...