Расширяйте объекты Itcl с помощью методов внутри конструктора

Есть ли в Itcl возможность динамически расширять класс с помощью методов внутри конструктора?

У меня есть некоторые функции, которые генерируются динамически...

Выглядят они как-то так:

proc attributeFunction fname {
    set res "proc $fname args {
        #set a attribute list in the class  
    }"
    uplevel 1 $res
}

Теперь у меня есть файл со списком возможных атрибутов:

attributeFunction ::func1
attributeFunction ::func2
attributeFunction ::func3 
...

Этот файл получает источник. Но пока я добавляю глобальные функции. Было бы лучше добавить эти функции в качестве методов к объекту Itcl.

Немного справочной информации:

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


person TM90    schedule 16.01.2015    source источник
comment
Это itcl 3 (вероятно 3.6) или 4? Я не знаю, может ли 3 поддерживать такие вещи, но базовая технология, на которой построена 4, определенно может это сделать. Сможет ли 4 этим воспользоваться… не знаю.   -  person Donal Fellows    schedule 17.01.2015
comment
Это itcl 3... Однако есть ли способ в 3 и какой новый механизм в 4?   -  person TM90    schedule 17.01.2015
comment
Хорошо, мне достаточно, чтобы написать решение.   -  person Donal Fellows    schedule 17.01.2015


Ответы (1)


В Itcl 3 все, что вы можете сделать, это переопределить существующий метод (используя команду itcl::body). Вы не можете создавать новые методы в конструкторе.

Вы можете сделать это в Itcl 4, потому что он построен на основе TclOO (полностью динамическое ядро ​​OO). Для этого вам понадобятся базовые средства TclOO, но команда, которую вы вызываете, выглядит примерно так:

::oo::objdefine [self] method myMethodName {someargument} {
    puts "in the method we can do what we want..."
}

Вот более полный пример:

% package require itcl
4.0.2
% itcl::class Foo {
    constructor {} {
        ::oo::objdefine [self] method myMethodName {someargument} {
            puts "in the method we can do what we want..."
        }
    }
}
% Foo abc
abc
% abc myMethodName x
in the method we can do what we want...

Похоже, это работает для меня…

person Donal Fellows    schedule 17.01.2015
comment
Раскрытие информации: я написал TclOO; Я близко знаю его возможности. :-D - person Donal Fellows; 18.01.2015
comment
На самом деле это круто... Но почему вы уверены, что в itcl3 нет такого же механизма? - person TM90; 18.01.2015