Может ли класс VFP получить коллекцию своих собственных методов во время выполнения? - PullRequest
0 голосов
/ 20 января 2011

Вот что я пытаюсь сделать в Visual FoxPro. Я хочу написать родительский класс UnitTest, который можно разделить на подклассы для создания отдельных модульных тестов. Я надеюсь, что родительский UnitTest может иметь MainMethod, который проверяет себя, а затем находит и выполняет все свои собственные методы, которые начинаются с «test_».

Таким образом, я могу продолжать писать функции с соответствующими именами в своих модульных тестах, и родитель будет знать, как их запускать без какого-либо дополнительного ввода от меня. Но я не могу найти какой-либо способ получить эту информацию от VFP во время выполнения, без того, чтобы дочерний класс явно не определил коллекцию имен методов или что-то в этом отношении (именно этого я и надеюсь избежать).

Вот основная заглушка:

define class UnitTest as custom  && would be abstract if VFP supported that

    procedure MainMethod()
        && run all methods that begin with test_
    endproc

enddefine

define class AUnitTest as UnitTest

    procedure test_thingA()
        ...
    endproc

    procedure test_thingB()
        ...
    endproc

enddefine

Буду любить чьи-либо идеи о том, как получить у ребенка методы от родителя. (Также открыта для лучшей идеи реализации, если я ошибаюсь, я думаю, основная идея того, что я иду, ясна).

Большое спасибо заранее!

1 Ответ

2 голосов
/ 21 января 2011

Функция AMEMBERS () может использоваться для получения списка методов.

loX = CREATEOBJECT("AUnitTest")
loX.MainMethod()
STORE .NULL. TO loX
RETURN


define class UnitTest as custom

    procedure MainMethod()
        LOCAL lcCommand, lcName, lcType, lnMemberNo, lnTotalMembers
        LOCAL ARRAY laMembers(1)

        m.lnTotalMembers = AMEMBERS(laMembers, THIS, 1, "U")
        FOR m.lnMemberNo = 1 TO m.lnTotalMembers
            m.lcName = m.laMembers[m.lnMemberNo,1]
            m.lcType = m.laMembers[m.lnMemberNo,2]

            IF (m.lcType == "Method") AND (LEFT(m.lcName, 5) == "TEST_")
                m.lcCommand = "THIS." + m.lcName + "()"
                &lcCommand
            ELSE
                * do nothing
            ENDIF
        ENDFOR

    endproc

enddefine

define class AUnitTest as UnitTest

    procedure test_thingA()
        WAIT WINDOW "Testing Thing A"
    endproc

    procedure test_thingB()
        WAIT WINDOW "Testing Thing B"
    endproc

    procedure NotATest()
        WAIT WINDOW "Not A Test"
    endproc

enddefine
...