Как я могу создать подкласс (расширить) класс Java с помощью Rhino, когда мне нужно использовать конструктор, который принимает аргумент? - PullRequest
4 голосов
/ 19 октября 2011

У меня есть класс, подобный следующему - это часть библиотеки, и я вообще не могу его изменить (если бы я мог, я бы просто переписал его или создал подкласс в Java)

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

Я хочу создать объект Javascript из этого объекта с помощью Rhino (поэтому нет комментариев о том, что 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;
   }
   ...
}

Но я не могу сделать это в Javascript. Вещи, которые я пробовал до сих пор ...

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;
}

Есть еще предложения?

1 Ответ

0 голосов
/ 19 октября 2011

Попробуйте подход прототипа:

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...
    }
}

Таким образом, идея заключается в том, что вы создаете объект JavaScript, который ведет себя как экземпляр FirstClass, предлагая те же методы (вам необходимо зарегистрировать каждый метод вручную) и передавая вызовы скрытому экземпляру inst.

Не будет работать с instanceof, но полезно, если вам нужно только Утиная печать .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...