Вот обновленное быстрое краткое изложение многочисленного системы объекта R согласно [1 129] "Усовершенствованный R, 2-й выпуск" (Нажатие CRC, 2019) Hadley Wickham (Руководитель исследовательских работ в RStudio), который имеет веб-представление здесь , на основе главы приблизительно [1 111] Объектно-ориентированное программирование .
первый выпуск с 2015 имеет веб-представление здесь с соответствующей главой по OO здесь .
Hadley определяет следующее для различения двух отличных подходов к программированию OO:
Функциональное ООП : методы (вызываемые части кода) принадлежат [1 130] родовые функции (чтобы не быть перепутанными с Java/C# общие методы ). Думайте о методах, как располагаемых в глобальной таблице поиска. Метод для выполнения найден системой во время выполнения на основе названия функции, и тип (или класс объекта) одного или нескольких аргументов передал той функции (это называют "отправкой метода"). Мудрые синтаксисом, вызовы метода могут быть похожими на вызовы обычной функции: myfunc(object, arg1, arg2)
. Этот вызов привел бы время выполнения искать метод, связанный с парой ("myfunc", typeof (объект)) или возможно ("myfunc", typeof (объект), typeof (arg1), typeof (arg2)) если поддержки языка это. В R S3 полное имя родовой функции дает (имя функции, класс) пара. Например: mean.Date
метод для вычислений средних из Дат. Попробуйте methods("mean")
для списка общих методов с именем функции mean
. Функциональный подход ООП найден, например, в пионере OO Smalltalk, Система Объекта языка Common LISP и Julia. Hadley отмечает, что "По сравнению с R, реализация Julia’s полностью разрабатывается и чрезвычайно производительна".
Инкапсулированное ООП : методы принадлежат объектам или классам, и вызовы метода обычно похожи object.method(arg1, arg2)
. Это называют , инкапсулировал , потому что объект инкапсулирует и данные (поля) и поведение (методы). Думайте о методе, как располагаемом в таблице поиска, присоединенной к объекту или описанию класса объекта. Время выполнения ищет метод на основе имени метода и возможно типа одного или нескольких аргументов. Это - подход, найденный на "популярных" языках OO как C++, Java, C#.
В обоих случаях, если наследование поддерживается (это, вероятно), время выполнения может пересечь иерархию классов вверх, пока это не нашло достойным ключа поиска вызова.
library(sloop) # formerly, "pryr"
otype(mtcars)
#> [1] "S3"
library(R6)
) self
, private
, super
) и функции членства (функции, присвоенные полям, но который не является методами, просто функционирует) существуют другие, как [11 100], R.oo (подобный RC), первичный (основанный на прототипе, думают JavaScript), и Mutatr. Однако "Усовершенствованный R" говорит:
Кроме R6, который широко используется, эти системы, прежде всего, представляют теоретический интерес. У них действительно есть свои преимущества, но немного пользователей R знают и понимают их, таким образом, другим трудно читать и способствовать Вашему коду.
убедиться прочитать главу по [1 126] компромиссы в [1 147] "Усовершенствованный R, 2-й выпуск" , также.