Ich habe eine generische Funktion namens foo
. Es funktioniert anders in den Klassen bar
und baz
, aber es gibt eine gemeinsame Vorverarbeitung, die nur einmal durchgeführt werden muss. Was ist die idiomatische Art, dies auszuführen?
In meinem albernen Beispiel möchte ich das übergebene Objekt mit 10 multiplizieren. Wenn die Methode aufgerufen wird, wird der ursprüngliche Wert auf der Konsole ausgegeben. Ich habe die Sprachdefinition gelesen und weiß, dass das folgende Muster nicht funktioniert. Meine Frage ist: Wo oder wie behandle ich die gemeinsame Verarbeitung von generischen Argumenten vor dem Aufruf der Methode?
%Vor% 1) Fügen Sie foo über dem eigentlichen generischen hinzu. Ändern Sie foo
, um den vorläufigen Code auszuführen, und rufen Sie foo_
wie abgebildet auf. Benennen Sie foo.bar
und foo.baz
in foo_.bar
bzw. foo_.baz
um, so dass wir übrig bleiben (wir haben dem Beispiel auch Zeilenumbrüche hinzugefügt):
Teste es jetzt:
%Vor%Ein Beispiel hierfür in einem weit verbreiteten Paket finden Sie in der Quelle dplyr :: mutiere
2) NextMethod Ein anderer Weg wäre, jedem Objekt einen Klassenvektor mit zwei Klassen zu geben, wobei "foo"
eine Unterklasse von "bar"
im Fall von a
und von "baz"
erstellt. im Fall von b
. Dann benutze NextMethod
. Lösung (1) scheint einfacher zu sein und es mag seltsam erscheinen, dass "foo"
eine Unterklasse von "bar"
und "baz"
ist, aber hier ist ein Beispiel für diesen Fall:
Testen Sie, dass wir die Definitionen von a
und b
so geändert haben, dass sie mit diesem Ansatz funktionieren: