0

次のコード宣言があるとします。

itcl::class ObjectA {
    private variable m_ownedObject
    private variable m_someVariable

   constructor {} \
   {
        set m_ownedObject [ObjectA #auto]
   }

   protected method SetSomeVariable {newVal} {
       set m_someVariable $newVal
   }

   public method SomeMethod{} {
       $m_ownedObject SetSomeVariable 5
   }
}

これは、 m_ownedObjectm_someVariable内から変更する方法を私が知っている唯一の方法です。SomeMethod他の言語(たとえば、C / C ++ / C#/ Javaなど)では、次のように言うことができると確信しています。

m_ownedObject.m_someVariable = 5

tclでこのようなことを行う方法はありますか、それとも常に保護されたゲッターとセッターを作成する必要がありますか?うまくいけば、これはかなり明確です。

4

3 に答える 3

2

itclで求めていることを直接行うことはできません。ただし、これはTclであるため、これを回避して、どこからでもメンバー変数を直接設定できます。memvインスタンスと変数名を渡すというヘルパールーチンを使用すると、その変数への「参照」が返されます。

これは明らかに、Itclが設定したプライベート/保護されたメカニズムをバイパスするため、それらを使用して抽象化に違反しています。あなたがそれを使いたいかどうかはあなたの呼びかけです。デバッグには非常に貴重だと思いますが、本番コードではそうではありません。

使用例は次のとおりです。

set [memv m_ownedObject m_someVariable] 5

のコードmemvは次のとおりです。

proc memv {obj varname} {
  # have to look up the variable, which might be in a base class
  # so do 'info variable' to get that, and the full name is the 3rd element

  # next two lines handle pulling apart an array
  set aindex ""
  regexp -- {^(.+)\((.+)\)$} $varname ignore varname aindex

  set var [lindex [$obj info variable $varname] 2]

  if {$aindex == ""} {
    return [list @itcl $obj $var]
  } else {
    return [list @itcl $obj $var\($aindex\)]
  }
}

同様に、memv任意のメソッド(プライベートメソッドと保護されたメソッドを含む)を呼び出すことができるという名前のヘルパールーチンがあります。使い方は似ています

[memf m_ownedObject SetSomeVariable] 5

そして、そのコードは次のとおりです。

proc memf {obj fcnname} {
  set f [$obj info function $fcnname]
  if {[llength $f] != 5} {
    error "expected '$obj info function $fcnname' to return something like 'private proc ::namespace::name args {...}' but got: $f"
  }
  set fullname [lindex [$obj info function $fcnname] 2]
  set namespace [namespace qualifiers $fullname]
  set function [namespace tail $fullname]
  return [itcl::code -namespace $namespace $obj $function]
}
于 2010-02-04T20:15:16.817 に答える
2
$m_ownedObject configure -m_someVariable 5
于 2011-06-07T14:24:35.217 に答える
1

変数をプライベートとして宣言している場合は、クラス内からのみアクセスできることを意味します。そして、それはC / C ++ / Javaにも当てはまります...だから、あなたが何を期待しているのかわかりません。

とにかくTclは動的言語なので、そのようなことができます。

  itcl::class tclass {
      foreach v {time distance} {
        method get$v {} [subst -nocommands { return [subst $$v] }]
        method set$v nuval [subst -nocommands { set $v \$nuval } ]
        protected variable $v "Var $v"
      }
  }

そしてそれはあなたが必要とするすべてとを作成しgettersますsetters;)

あなたはここでより多くの情報を見つけることができます:http ://wiki.tcl.tk/17667

于 2010-02-04T16:51:35.247 に答える