Avatar billede di8leva Nybegynder
06. december 2002 - 12:21 Der er 5 kommentarer og
2 løsninger

override metode at runtime

er der en måde at override en metode "under runtime"
dvs efter det att jag skapat objectet.

f.eks (ikke virkende kode dock)

JComboBox box = new JCOmboBox();
if(box instanceof boxModel1)
box = box
{
  public void do()
  {
      print(1);

  }
};
else
box = box
{
  public void do()
  {
      print(2);

  }
};



????
Avatar billede kennie_nm Nybegynder
06. december 2002 - 12:47 #1
nej, det er det ikke

men du kan lave et lille trick:

* lav en privat variabel 'obj_type', der angiver objektets type
* lad alle public metoder være uden parameter, men
  lad dem kalde private parametrisede metoder, der tager en objekt type varaibel

eks (ret selv Java syntax til):

class Foo{
  private objType integer;

  private do( objType integer ){
    if( objType == 1 ){¥
      print(1);
    }
    else if ( objType == 2 ) {
      print(2);
    }
  }

  public do(){
    do( objType );
  }

  public setType( newObjType integer ){
    objType = newObjType;
  }
}
Avatar billede carstenknudsen Nybegynder
06. december 2002 - 12:53 #2
Du kan override en metode ved runtime hvis
den vel at mærke er defineret i et interface.
Så benytter du Proxy klassen med en InvocationHandler
til at klare det, men det er helt trivielt.
Avatar billede carstenknudsen Nybegynder
06. december 2002 - 12:53 #3
Undskyld: skulle have være "det er ikke helt trivielt".
Avatar billede di8leva Nybegynder
06. december 2002 - 14:59 #4
carsten >> interface ok, det kænner jag, men som man normalt bruger et interface er man nødt till at bruge en klass der definierar den metode. og hvis man bruger en abstractclass måste man definiera den metode vid new...

men hvad er proxy-klassen og en InvocationHandler?
Avatar billede di8leva Nybegynder
11. december 2002 - 07:51 #5
nå...
her blev det ikke mer info
Avatar billede carstenknudsen Nybegynder
11. december 2002 - 10:06 #6
Undskyld, men jeg så ikke din kommentar. Proxy og InvocationHandler
er nogle af de mere interessante aspekter af Java API'erne.
De ligger i java.lang.reflect og er en del af den såkaldte
reflection API (sammen med java.lang.Class). Den tillader at
du tager et objekt under runtime, og fjerner og tilføjer
interfaces som du har lyst og så genererer den et nyt objekt
der implementerer de ønskede interfaces. Det er virkelig
et stærkt værktøj som jeg bruger meget, men det er ikke så
let at arbejde med.
Avatar billede carstenknudsen Nybegynder
11. december 2002 - 10:24 #7
Her er et lille eksempel der viser hvordan man
kan tilføje et interface java.io.Serializable
ved runtime, og samtidig skriver den ud når
der kaldes metoder på objektet. Dette kan bruges
til at lave elegant debugging.
import java.util.*;
import java.lang.reflect.*;

public class SimpleProxy implements InvocationHandler {

    Object o;

    private SimpleProxy( Object o ) {
    this.o = o;
    }

    public static Object proxyFor( Object o ) {
    Class objClass = o.getClass();
    Class[] oldInterfaces = objClass.getInterfaces();
    Class[] newInterfaces = new Class[ oldInterfaces.length + 1 ];
    for (int i = 0; i < oldInterfaces.length; i++)
        newInterfaces[ i ] = oldInterfaces[ i ];
    newInterfaces[ oldInterfaces.length ] = java.io.Serializable.class;
    return
        Proxy.newProxyInstance( objClass.getClassLoader(),
                    newInterfaces,
                    new SimpleProxy( o ) );
    }
   
    public Object invoke( Object proxy, Method method, Object[] args )
    throws Throwable {
    System.out.println("Invoking " + method.getName() );
    Object returnValue = method.invoke( o, args );
    System.out.println( "Return value is: " + returnValue );
    return returnValue;
    } // invoke

    public static void main( String[] args ) {
    java.util.List list = new java.util.ArrayList();
    Object o = SimpleProxy.proxyFor( list );
    java.io.Serializable ser = (java.io.Serializable)o;
    java.util.List lst = (java.util.List)o;
    lst.add("abc");
    int hashCode = lst.hashCode();
    System.out.println("ser="+ser);
    System.out.println("lst="+lst);
    }
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester