0

現在 R に移行中で、オブジェクト指向設計を使用したいと考えています。さまざまな実装 (S3、S4、参照クラス、または R.oo パッケージ) のいずれかを選択することの意味を完全に理解しているかどうかはわかりませんが、R.oo パッケージを使用することにしました。他のプログラミング言語から得た OOP の初歩的な理解とともに。

また、この機会にオブジェクト構造を完全にオーバーホールし、多くのクラスを作成するには多重継承が最も「自然な」方法であるという事実に何度も立ち返っています。R.oo では、継承はコンストラクターで extend() を呼び出すことによって指定され、最初のパラメーターは親クラスであるため、コンストラクターで extend() を 2 回呼び出して、うまくいくかどうかを確認してみました。それはしませんでした。ドキュメントの例に基づく次のコードは、エラーを再現します。

setConstructorS3("SavingsAccount", function(balance=0) {

  if (balance < 0)
    throw("Trying to create an account with a negative balance: ", balance);
  extend(Object(), "SavingsAccount",
         .balance = balance
  )
})


setConstructorS3("SavingsAccount2", function(balance=0) {

  if (balance < 0)
    throw("Trying to create an account with a negative balance: ", balance);
  extend(Object(), "SavingsAccount2",
         .balance2 = balance
  )
})

setConstructorS3("SavingsAccount3", function(balance=0) {

  if (balance < 0)
    throw("Trying to create an account with a negative balance: ", balance);
  extend(SavingsAccount2(balance), "SavingsAccount3"
         )
  extend(SavingsAccount(balance), "SavingsAccount3"
  )
})

これは非常にばかげた例ですが、エラーを再現します。実際、あなたがするとき:

SA = SavingsAccount3(23)

あなたが得る:

> SA$.balance2
NULL
> SA$.balance
[1] 23

これは、extend() への 2 番目の呼び出しが最初の呼び出しの結果をオーバーライドすることを意味しているようです。だから、私の質問は: - R.oo パッケージでそれを行うことは可能ですか? (S4 で可能であることはわかっています) - もしそうなら、上記のコードで何を変更すればよいですか?

よろしくお願いいたします。

4

0 に答える 0