Class Incr-Tcl对象类的层次结构

Class Incr-Tcl对象类的层次结构,class,tcl,incr-tcl,itcl,Class,Tcl,Incr Tcl,Itcl,我试图实现类/子类对象的层次结构,例如: |-- Class1 # mainClass | |-- SubClassA # subClass | `-- SubClassB # subClass `-- Class2 # mainClass |-- SubClassA # subClass `-- SubClassB # su

我试图实现类/子类对象的层次结构,例如:

|-- Class1                  # mainClass
|   |-- SubClassA           # subClass
|   `-- SubClassB           # subClass
`-- Class2                  # mainClass
    |-- SubClassA           # subClass
    `-- SubClassB           # subClass
这里的要点是能够在每个主类中声明具有相同名称的不同子类(并且它们的变量是独立的)

(注意:我这里讲的是在执行过程中创建的类对象的层次结构,而不是不同类的继承。)

我不太熟悉Tcl特有的一些高级方面(名称空间、范围…),我尝试了以下代码:

包需要Itcl
itcl::类子类{
变量内部变量
构造函数{}{
放置“($this)当前命名空间:[当前命名空间]”
放置“($this)InternalVariable作用域:[itcl::scope InternalVariable]”
}
}
itcl::类mainClass{
可变子类列表
构造函数{}{
集合子类列表{}
放置“($this)当前命名空间:[当前命名空间]”
放置“($this)子类列表范围:[itcl::scope SubassessList]”
}
方法newSubClass{argName}{
lappend子类列表[子类$argName]
放置“($this)子类列表:{$subassesslist}”
}
}
#创建两个主要类
主要类别1
主要类别2
#向类1和类2添加一些子类
Class1新闻子类子类
Class1 newSubClass子类B
Class2新闻子类子类C
Class2新闻子类B
在创建第二次出现的
子类B
时产生错误:

(::Class1)     current namespace      : ::mainClass
(::Class1)     SubClassesList scope   : @itcl ::Class1 ::mainClass::SubClassesList
(::Class2)     current namespace      : ::mainClass
(::Class2)     SubClassesList scope   : @itcl ::Class2 ::mainClass::SubClassesList
(::mainClass::SubClassA)     Current namespace      : ::subClass
(::mainClass::SubClassA)     InternalVariable scope : @itcl ::mainClass::SubClassA ::subClass::InternalVariable
(::Class1)     SubClassesList         : {SubClassA}
(::mainClass::SubClassB)     Current namespace      : ::subClass
(::mainClass::SubClassB)     InternalVariable scope : @itcl ::mainClass::SubClassB ::subClass::InternalVariable
(::Class1)     SubClassesList         : {SubClassA SubClassB}
(::mainClass::SubClassC)     Current namespace      : ::subClass
(::mainClass::SubClassC)     InternalVariable scope : @itcl ::mainClass::SubClassC ::subClass::InternalVariable
(::Class2)     SubClassesList         : {SubClassC}
command "SubClassB" already exists in namespace "::mainClass"
我可能忽略了关于类名称空间的一点,因为我不理解变量
subassesList
如何可以有两个不同的作用域,但名称空间/名称“相同”(来自调试输出)

我试图在
newSubClass
方法中创建一个新名称空间,但它没有解决问题和/或添加一些无法解决的变量名称空间错误

方法newSubClass{argName}{
设置子类名称“[命名空间当前]::[命名空间尾部$this]”
放置“($this)子类名称:$subclass名称”
命名空间eval$SubClassName“lappend subclassist[subClass$argName]”
放置“($this)子类列表:{$subassesslist}”
}
有没有想过要做这样的事

p-S:出于与现有环境兼容的原因,我使用[incr Tcl]在我的项目中实现类,但如果有人认为其他OO实现会更好/更容易,请让我知道


编辑: 通过使用
namespace eval
+
namespace inscope
在与
mainClass
对象名称对应的新命名空间中创建
子类
对象,找到了解决方案:

itcl::class mainClass{
可变子类列表
构造函数{}{
集合子类列表{}
放置“($this)当前命名空间:[当前命名空间]”
放置“($this)子类列表范围:[itcl::scope SubassessList]”
#创建与类名对应的新命名空间
命名空间eval$this{}
}
方法newSubClass{argName}{
#在$this命名空间中创建子类对象
lappend子类列表[命名空间inscope$this子类$argName]
放置“($this)子类列表:{$subassesslist}”
}
}

我认为您混淆了类和对象:类是用于创建对象的蓝图或模板。在您的示例中:

  • mainClass
    subClass
    是类
  • Class1
    Class2
    子类
    子类B
    子类C
    都是对象,也称为类的实例
在Itcl中,每个类都有自己的名称空间,例如,class
mainClass
拥有一个名为
::mainClass
的名称空间——您可以在代码的输出中看到以下证据:

(::Class1)     current namespace      : ::mainClass
^^^^^^^^^^
此外,每个对象都有自己的名称空间:。例如,
子类b
对象拥有名称空间
::mainClass:SubClass

(::mainClass::SubClassB)     InternalVariable scope : @itcl ::mainClass::SubClassB ::subClass::InternalVariable
^^^^^^^^^^^^^^^^^^^^^^^^
这意味着,不能让两个对象共享同一个名称——这就是您得到的错误。如果您仍然希望示例起作用,请使用对象名称
#auto

method newSubClass {argName} {
    lappend SubClassesList [subClass #auto] ;# <=== Use automatic naming
    puts "($this)     SubClassesList         : {$SubClassesList}"
}
方法newSubClass{argName}{

lappend子类列表[子类#自动]##我需要可移植性,我建议使用snit或stooop。它们都是用纯Tcl编写的,应该在Tcl运行的任何地方运行。谢谢你的回答。我想我理解这一点和问题。
#auto
解决方案很有效,但这是一个问题,因为在执行之前我必须知道每个
子类
对象的名称(太长了,无法解释为什么在这里…。然后有一个问题:是否可以在一个名为例如
::Class1
的新名称空间中创建对象
子类
,以及如何创建?好的,找到了一个使用
名称空间eval
+
名称空间inscope
的替代解决方案(后期编辑).不知道这是否是一个非常干净的解决方案,但它似乎适合我的需要。再次感谢您的解释。