Отказ от реализации этого кажется преднамеренным выбором (я пробовал 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()
.
Ага! Большое спасибо за это разъяснение!
Отлично, рад, что помог!
Самый полезный комментарий
В
super
доступны как публичные, так и частные методы. Итак, в вашем примере вы можете просто использоватьsuper$bar()
.