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
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
的替代解决方案(后期编辑).不知道这是否是一个非常干净的解决方案,但它似乎适合我的需要。再次感谢您的解释。