Spec-Zone.ru › Tcl/Tk

body

Имя

itcl::body — изменение тела для метода/процедуры класса

Синтаксис

itcl::body className::function args body

Описание

Команда body используется вне определения класса [incr Tcl] для определения или переопределения тела метода или процедуры класса. Эта возможность позволяет разделять «интерфейсную» и «реализационную» части определения класса. «Интерфейсная» часть — это команда class с объявлениями методов, процедур, переменных экземпляра и общих переменных. «Реализационная» часть — это набор команд body и configbody. Если «реализационную» часть хранить в отдельном файле, её можно многократно подключать при исправлении ошибок, чтобы поддерживать интерактивное развитие. При использовании режима «tcl» в редакторе emacs «интерфейсную» и «реализационную» части можно хранить в одном файле; при исправлении ошибок отдельные тела можно выделять и отправлять в тестовое приложение.

Имя «className::function» идентифицирует изменяемый метод/процедуру.

Если при определении function в определении класса был указан список args, список args для команды body должен соответствовать по смыслу. Имена переменных могут меняться, но списки аргументов должны иметь одинаковые обязательные аргументы и одинаковые значения по умолчанию для необязательных аргументов. Специальный аргумент args действует как подстановочный знак, когда включён в список args в определении класса; он будет соответствовать нулю или более аргументам любого типа при переопределении тела.

Если строка body начинается с «@», она рассматривается как символическое имя C-процедуры. Список args имеет мало значения для C-процедуры, за исключением документации ожидаемого использования. (C-процедура не гарантирует использование аргументов таким образом.) Если body не начинается с «@», она рассматривается как сценарий команд Tcl. При вызове функции аргументы командной строки сопоставляются со списком args, и создаются локальные переменные для представления каждого аргумента. Это обычное поведение для процедуры в стиле Tcl.

Символические имена C-процедур устанавливаются путём регистрации процедур с помощью Itcl_RegisterC(). Это обычно делается в процедуре Tcl_AppInit(), которая автоматически вызывается при запуске интерпретатора. В следующем примере процедура My_FooCmd() регистрируется под символическим именем «foo». Эта процедура может быть упомянута в команде body как "@foo".

int
Tcl_AppInit(interp)
    Tcl_Interp *interp;     /* Interpreter for application. */
{
    if (Itcl_Init(interp) == TCL_ERROR) {
        return TCL_ERROR;
    }

    if (Itcl_RegisterC(interp, "foo", My_FooCmd) != TCL_OK) {
        return TCL_ERROR;
    }
}

Пример

В следующем примере определяется класс «File» для представления открытых файлов. Тела методов включены ниже определения класса с помощью команды body. Обратите внимание, что тела конструктора/деструктора должны быть включены в определение класса, но их также можно переопределить с помощью команды body.
itcl::class File {
    private variable fid ""
    constructor {name access} {
        set fid [open $name $access]
    }
    destructor {
        close $fid
    }

    method get {}
    method put {line}
    method eof {}
}

itcl::body File::get {} {
    return [gets $fid]
}
itcl::body File::put {line} {
    puts $fid $line
}
itcl::body File::eof {} {
    return [::eof $fid]
}

#
# See the File class in action:
#
File x /etc/passwd "r"
while {![x eof]} {
    puts "=> [x get]"
}
itcl::delete object x

Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/ItclCmd/body.htm

Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/ItclCmd/body.htm

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API