2014-10-21 3 views
2

저는 루아를 처음 접했고 수업 시스템을 작동 시키려고합니다. 내가하고 싶은 것은 속성의 무리가있는 기본 클래스가 다음과 같은 기본 클래스 속성을해야합니다루아 계승 대체 기능

등 버튼, 텍스트 상자 등의 개체에 대해이 클래스를 확장 할을 수행하는 등 x, y, width , height 등등 다른 클래스는 다음과 같이 말합니다 : label 또는 colour 또는 이와 유사합니다.

기본 클래스에 render()와 같은 함수를 만들고이 함수를 나중에 재정의하려고하면 작동하지 않는 것 같습니다. 나는 Button.create("TestBtn"):render() 싶습니다 무엇

Base = {} 
Base.__index = Base 
function Base.create(value) 
    local b = {} 
    setmetatable(b, Base) 
    b.value = value 
    return b 
end 

function Base:render() 
    print("I'm the base! : "..self.value) 
end 

Button = {} 
Button.__index = Base 

function Button.create(value) 
    local b = Base.create(value) 
    setmetatable(b, Button) 
    return b 
end 

function Button:render() 
    print("I'm a button! : "..self.value) 
end 

Button.create("TestBtn"):render() 

할이 I'm the base! : TestBtn를 인쇄하지만 I'm a button! : TestBtn를 인쇄하는 것입니다 (! 아마도 내가 완전히 잘못 클래스를 사용하고 있습니다) 여기

은 내가 사용하고 무엇을 아래로 재생 예입니다.

누군가가 원래의 render 기능을이 새로운 기능으로 대체하는 데 도움이 될 수 있습니까?

감사합니다.

+0

'Button .__ index = Base'가 틀립니다. Base'__ index = Base'와 어떻게 같은지 주목하십시오. –

+0

@Etan 좋습니다. 상속이 그 마술을 어떻게했는지 생각했습니다. 그래서 내가 무엇을 놓치고 잘못 했는가? –

+1

글쎄, 나는 약간 갑작스럽게 생각했다. 'Button '을'Base'에 연결하는 것은 맞습니다. 문제는'Button' 자체를'__index'로 사용하지 않는다는 것입니다. 내가 믿는'Button.create'에서'setmetatable (b, {__index = Button})'을 할 필요가 있습니다. 미안합니다. –

답변

1

@siffiejoe가 말했듯이 실종 된 세부 정보는 Button 개체가 Button 표를보고 알지 못하는 것으로 기록되어 있습니다.

내 솔루션이 가비지 테이블을 만들어 해당 연결을 만들었으므로 실제로 가장 좋은 해결책은 아니지만 요점을 설명했습니다.

@ siffiejoe의 답변은 원하는 기능과 관계를보다 정확하게 체계화한다는 점에서 더 낫습니다. 또한 '클래스'표를 연결하는 추가 단계가 필요합니다 (예 : setmetatable(Button, Base)).

여기서 핵심은 메타 메서드 index의 작동입니다. 이것은 루아의 코드로 설명되어 있습니다. Reference Manual :

"index": The indexing access table[key]. 

function gettable_event (table, key) 
    local h 
    if type(table) == "table" then 
    local v = rawget(table, key) 
    if v ~= nil then return v end 
    h = metatable(table).__index 
    if h == nil then return nil end 
    else 
    h = metatable(table).__index 
    if h == nil then 
     error(···) 
    end 
    end 
    if type(h) == "function" then 
    return (h(table, key))  -- call the handler 
    else return h[key]   -- or repeat operation on it 
    end 
end 
0

Button:test 대신 Button:render을 정의하십시오.

+0

답장을 보내 주셔서 감사합니다. 그것은 나보다 오히려 어리 석다! 그러나 여전히 Base : render()를 실행하는 것으로 보입니다 : codepad.org/AfODqE9J –