1. Learn
  2. /
  3. Courses
  4. /
  5. R における S3 と R6 を使ったオブジェクト指向プログラミング

Connected

Exercise

出力の制御

アクティブバインディングは、プライベートフィールドの設定にも使えます。この場合、バインディング関数は "value" という名前の1つの引数を受け取る必要があります。

読み書き可能なアクティブバインディングを作るパターンは次のとおりです。

thing_factory <- R6Class(
  "Thing",
  private = list(
    ..a_field = "a value"
  ),
  active = list(
    a_field = function(value) {
      if(missing(value)) {
        private$..a_field
      } else {
        assert_is_a_string(value) # または別のアサーション
        private$..a_field <- value
      }
    }
  )
)

値の代入は、バインディングが関数ではなくデータ変数であるかのように行います。

a_thing <- thing_factory$new()
a_thing$a_field <- "a new value" # a_thing$a_field("a new value") ではありません

Instructions

100 XP

電子レンジのクラスが一部定義されています。

  • 電子レンジクラスの定義を拡張して、active リスト要素を追加してください。
  • active 要素に、出力(パワー)レベルを制御するアクティブバインディングを追加してください。
    • 関数名は power_level_watts とします。
    • value という名前の1つの引数を受け取るようにします。
    • 取得/設定するプライベート変数は ..power_level_watts です。
    • assert_is_a_number()(docs)を使って、value が単一の数値であることを確認します。
    • assert_all_are_in_closed_range()(docs)を使って、value が 0 から ..power_rating_watts の範囲内であることを確認します。
  • 電子レンジオブジェクトを作成し、a_microwave_oven に代入してください。
  • 現在の出力レベルを取得してください。
  • 文字列の "400" を出力レベルに設定しようとしてみてください。
  • 出力レベルを 1600 に設定しようとしてみてください。
  • 出力レベルを 400 に設定してください。