R6: スーパークラスのプライベートメソッドへのアクセス

作成日 2015年02月17日  ·  3コメント  ·  ソース: r-lib/R6

これを実装しないことは意図的な選択のように思われるので(私はsuper$private$foo()を試しましたが、機能しません)、サブクラスがスーパークラスのプライベートメソッドにアクセスできるのは一般的なOOPの原則に反していると思います。

しかし、それは本当に悪いことでしょうか? 結局のところ、継承は、既存の機能を再利用しながら、特定のクラスの機能を拡張する体系的な方法です。 しかし、拡張されているクラスのすべてのプライベートメソッドが「失われた」/サブクラスからアクセスできない場合、これによって不要なコードの重複が発生することはありません(必要なプライベートメソッドをプライベートメソッドとして定義する必要があるという意味で)サブクラス)?

私だけかもしれませんが、スーパークラスからメソッドを呼び出すサブクラスは、たとえば、特定のクラスインスタンスを使用するクライアントアプリケーションとは対照的に、かなり「内部」のものであると見なします(この場合、パブリックメソッドのみが必要になります)もちろんアクセス可能)。

Abar()に純粋な内部文字があり、特定のフィールド値の有効性をチェックしているため、公開したくないとします。 しかし、そのためにそのアクセス可能ではない方法でBと私は、このように、再び、全く同じメソッドを定義する必要がありますB

require("R6")
A <- R6Class(
  classname = "A",
  public = list(
    foo = function() {
      "foo"
    }
  ),
  private = list(
    bar = function() {
      "bar"
    }
  )
)

B <- R6Class(
  classname = "B",
  inherit = A,
  public = list(
    foobar = function() {
      print(super$foo())
      print(super$private$bar())
    }
  )
)

x <- B$new()
x$foobar()

最も参考になるコメント

superでは、パブリックメソッドとプライベートメソッドの両方を使用できます。 したがって、この例では、 super$bar()使用できます。

全てのコメント3件

superでは、パブリックメソッドとプライベートメソッドの両方を使用できます。 したがって、この例では、 super$bar()使用できます。

あはは! その説明に感謝します!

よかった、お役に立ててうれしいです!

このページは役に立ちましたか?
0 / 5 - 0 評価