R6: Доступ к частным методам суперкласса

Созданный на 17 февр. 2015  ·  3Комментарии  ·  Источник: r-lib/R6

Отказ от реализации этого кажется преднамеренным выбором (я пробовал super$private$foo() который не работает), и поэтому я предполагаю, что это противоречит общим принципам ООП, что подклассы могут получить доступ к частным методам своего суперкласса (ов).

Но разве это так плохо? В конце концов, наследование - это систематический способ расширения возможностей определенного класса при повторном использовании уже имеющихся. Но если все частные методы расширяемого класса «потеряны» / недоступны для подкласса, то это не приведет к ненужному дублированию кода (в том смысле, что требуемые частные методы должны быть снова определены как частные методы в классе подкласс)?

Возможно, это только я, но я бы рассматривал методы вызова подкласса из его суперкласса как нечто скорее «внутреннее», в отличие, скажем, от клиентского приложения, использующего определенный экземпляр класса (в этом случае вы бы хотели, чтобы общедоступные методы были доступно, конечно).

Предположим, что в A bar() имеет чистый внутренний символ и проверяет правильность определенных значений поля, поэтому вы не захотите делать его общедоступным. Но в этом случае он недоступен для 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 рейтинги