R6: Auf private Methoden der Superklasse zugreifen

Erstellt am 17. Feb. 2015  ·  3Kommentare  ·  Quelle: r-lib/R6

Dies nicht zu implementieren scheint eine bewusste Entscheidung zu sein (ich habe es mit super$private$foo() versucht, was nicht funktioniert) und daher vermute ich, dass es gegen die allgemeinen OOP-Prinzipien verstößt, dass Unterklassen auf die privaten Methoden ihrer Oberklasse(n) zugreifen können.

Aber wäre das wirklich so schlimm? Schließlich ist die Vererbung ein systematischer Weg, um die Merkmale einer bestimmten Klasse zu erweitern, während die bereits vorhandenen wiederverwendet werden. Aber wenn alle privaten Methoden der zu erweiternden Klasse "verloren"/für die Unterklasse nicht zugänglich sind, dann führt dies nicht zu unnötiger Code-Duplizierung (in dem Sinne, dass die erforderlichen privaten Methoden _erneut_ als private Methoden in der Unterklasse)?

Könnte nur ich sein, aber ich würde eine Unterklasse, die Methoden ihrer Oberklasse aufruft, als etwas eher "Internes" betrachten, im Gegensatz zu einer Client-Anwendung, die eine bestimmte Klasseninstanz verwendet (in diesem Fall möchten Sie nur, dass die öffentlichen Methoden natürlich zugänglich).

Angenommen, in A hat bar() einen reinen internen Charakter und prüft die Gültigkeit bestimmter Feldwerte, sodass Sie dies nicht veröffentlichen möchten. Aber auf diese Weise ist es für B nicht zugänglich und ich müsste daher genau dieselbe Methode in 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()

Hilfreichster Kommentar

In super stehen sowohl die öffentliche als auch die private Methode zur Verfügung. In Ihrem Beispiel könnten Sie also einfach super$bar() .

Alle 3 Kommentare

In super stehen sowohl die öffentliche als auch die private Methode zur Verfügung. In Ihrem Beispiel könnten Sie also einfach super$bar() .

Aha! Vielen Dank für diese Klarstellung!

Super, freut mich, dass es hilft!

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

mb706 picture mb706  ·  4Kommentare

wch picture wch  ·  8Kommentare

paulstaab picture paulstaab  ·  3Kommentare

gaborcsardi picture gaborcsardi  ·  22Kommentare

kenarab picture kenarab  ·  8Kommentare