Наследование статических функций в [incr Tcl] - PullRequest
3 голосов
/ 21 января 2011

Наследование в incr Tcl не работает должным образом.Рассмотрим приведенный ниже код.

package require Itcl

::itcl::class Base \
{
public {
    proc function { } { puts "==== Base::function" }
}
}

::itcl::class Derived { inherit Base }

Base::function
Derived::function    ;# FAILS

Последняя строка терпит неудачу, поэтому Base::function не наследуется на Derived, хотя Derived наследуется от Base.

Я делаючто-то не так, или incr Tcl предназначен так себя вести?

Ответы [ 2 ]

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

Чтение документации. Я не думаю, что проки в классе itcl работают так, как вы думаете:

имя процесса? Args? ? Тело? Объявляет процесс с именем name. Процедура - это обычная процедура в пространство имен класса. В отличие от метода, процесс вызывается без ссылки на конкретный объект. Когда тело процедуры будет выполнен автоматически Доступ только к общим данным членов. Если указан список аргументов, он устанавливает информацию об использовании для этот проц. Команда body может быть используется для переопределения тела процедуры, но список аргументов должен соответствовать этому Спецификация. В теле другого метода или метода класса может быть вызван процесс как любая другая команда - просто с помощью его имя. В любом другом пространстве имен контекст, proc вызывается с помощью квалифицированное имя типа "className :: proc". Проц в базовом классе, которые переопределено в текущем классе, или скрытый другим базовым классом, также может быть доступным через их квалифицированное имя.

Насколько я понимаю, proc связан с его классом, на него можно ссылаться в производном классе, но он не определен в нем Например, следующие работы:

package require Itcl

::itcl::class Base {
    public {
        proc function { } { puts "==== Base::function" }
    }
}

::itcl::class Derived { 
inherit Base 
    public {

        proc function { } { 
            puts "==== Derived::function"
            return [Base::function] 
        }
    }
}

Base::function
Derived::function    ;# FAILS
1 голос
/ 21 января 2011

Процесс, который вы определили Base::function, является (более или менее) обычным процессом в пространстве имен Base. Когда вы наследуете в Itcl, вы просто наследуете методы, а не наследуете procs. В соответствующей заметке вы не можете вызвать proc function из экземпляра Base, вы должны вызывать его как любой обычный proc.

itcl::class Base {
  public {
    proc function { } { puts "==== Base::function" }
  }
  public method test {} {
    $this function
  }
  public method test2 {} {
    function
  }
}

Base bb
bb test   ;# yields error: bad option "function"
bb test2  ;# works as expected
...