Взаимодействие с несколькими наследниками класса S4 - PullRequest
1 голос
/ 09 мая 2019

Я довольно новичок в объектно-ориентированном программировании на R и пытаюсь понять наследование.У меня проблема, при которой мне нужно видеть все объекты класса, наследуемые от родительского объекта класса, и я не уверен, как это сделать.

Я могу продемонстрировать свою проблему, используя общий пример из онлайнресурсы:

setClass("Person",
  slots = list(name = "character", age = "numeric"))
setClass("Employee",
  slots = list(boss = "Person"),
  contains = "Person")

## Create boss Alice
alice <- new("Person", name = "Alice", age = 40)

## Create Alice's subordinates
john <- new("Employee", name = "John", age = 20, boss = alice)
bob <- new("Employee", name = "John", age = 26, boss = alice)
jane <- new("Employee", name = "Jane", age = 22, boss = alice)

Я создал трех сотрудников, у каждого из которых один и тот же босс: Алиса.Однако, когда я запрашиваю объект класса Алисы, я не вижу, кто ее сотрудники.Я знаю, что это не то, как объект класса предназначен для работы, но, учитывая, что для моих целей мне нужно иметь возможность видеть, кто все сотрудники Алисы, какое лучшее решение я бы использовал для этого?

И, кроме того, я хотел бы иметь возможность циклически проходить через каждого из подчиненных Алисы, а затем извлекать и взаимодействовать с каждым из их объектов класса Employee.

Вот пример того, что я хотел бы сделать:

myFunction(funClassObj) {
  print(paste("Subordinate name: ", funClassObj@name))
  print(paste("Subordinate age: ", funClassObj@age))
}

for(subClassObj in alice@subordinates) {
  myFunction(subClassObj)
}

Мне не удалось это осуществить, и любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 09 мая 2019

РЕДАКТИРОВАТЬ : Вы можете альтернативно использовать и вместо этого связать Работодателя с Сотрудником:

setMethod("Bosses","Employee",function(object) object@boss)
setIs("Employee","Person",
      coerce = function(old) old@boss,
      replace =  function(old,new_val){
        old@name<-new_val
        old
      })
setMethod("Bosses","Person", function(object) object@boss)
Bosses(john)
An object of class "Person"
Slot "name":
[1] "Alice"

Slot "age":
[1] 40

Возможно, у кого-то есть лучший ответ, вот альтернатива:

setGeneric("Bosses",function(object) standardGeneric("Bosses"))
setMethod("Bosses","Employee",function(object) object@boss)
my_employees<-list(john,bob,jane)
lapply(my_employees,Bosses) #Maybe implement this in s4?

Результат:

[[1]]
An object of class "Person"
Slot "name":
[1] "Alice"

Slot "age":
[1] 40


[[2]]
An object of class "Person"
Slot "name":
[1] "Alice"

Slot "age":
[1] 40


[[3]]
An object of class "Person"
Slot "name":
[1] "Alice"

Slot "age":
[1] 40
...