簡體   English   中英

當我需要使用帶有參數的構造函數時,如何使用Rhino子類化(擴展)Java類?

[英]How can I subclass (extend) a Java class using Rhino when I need to use a constructor that takes an argument?

我有一個類似以下的類-這是一個庫的一部分,我根本無法更改(如果可以的話,我會重寫它或用Java對其進行子類化)

public class FirstClass
{
   public FirstClass(SecondClass arg)
   {
      ...
   }
   public ThirdClass aMethod()
   {
      ...
   }
   ...
}

我想使用Rhino從中創建一個Javascript對象(因此,請注意,關於JavaScript與Java的不同之處,請注意,我沒有),但是要覆蓋方法“ aMethod”。

所以在Java中,我會這樣做...

public class MySpecialFirstClass extends FirstClass
{
   public FirstClass(SecondClass arg)
   {
      super(arg);
   }
   public ThirdClass aMethod()
   {
      ThirdClass toReturn = super.aMethod();
      //My implementation goes here.
      return toReturn;
   }
   ...
}

但是我似乎無法用Java語言做到這一點。 到目前為止我嘗試過的事情...

function js_FirstClass(arg)
{
   var temp = JavaAdaptor(FirstClass, 
      {
         '<init>': FirstClass,
         aMethod: function()
         {
            var toReturn = super.aMethod();
            //Do stuff
            return toReturn;
         }
      });
   return temp;
}

我也嘗試過...

var myClass = new FirstClass(secondClass);
myClass.aMethodOld = myClass.aMethod;
myClass.aMethod = function()
{
   var toReturn = aMethodOld();
   //Do stuff
   return toReturn;
}

還有其他建議嗎?

嘗試原型方法:

function newFirstClass(arg) {
    // Create hidden instance
    var inst = new FirstClass(arg);
    return {
        aMethod: function() {
            var result = inst.aMethod();
            // ... do stuff
            return result;
        }
        // forward every other call directly to inst
        otherMethod: function() {
            return inst.otherMethod();
        }
        // etc...
    }
}

因此,想法是通過提供相同的方法(您需要手動注冊每個方法)並將調用傳遞給隱藏實例inst來創建一個行為類似於FirstClass實例的JavaScript對象。

不適用於instanceof但是如果您只需要輸入Duck則很有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM