2010-05-04 3 views
2

J'ai créé la classe abstraite suivante pour planificateur d'emplois dans red5:java: ne peut pas utiliser des constructeurs dans la classe abstraite

package com.demogames.jobs; 

import com.demogames.demofacebook.MysqlDb; 
import org.red5.server.api.IClient; 
import org.red5.server.api.IConnection; 
import org.red5.server.api.IScope; 
import org.red5.server.api.scheduling.IScheduledJob; 
import org.red5.server.api.so.ISharedObject; 
import org.apache.log4j.Logger; 
import org.red5.server.api.Red5; 

/** 
* 
* @author ufk 
*/ 
abstract public class DemoJob implements IScheduledJob { 

protected IConnection conn; 
protected IClient client; 
protected ISharedObject so; 
protected IScope scope; 
protected MysqlDb mysqldb; 

protected static org.apache.log4j.Logger log = Logger 
    .getLogger(DemoJob.class); 

protected DemoJob (ISharedObject so, MysqlDb mysqldb){ 

     this.conn=Red5.getConnectionLocal(); 
     this.client = conn.getClient(); 
     this.so=so; 
     this.mysqldb=mysqldb; 
     this.scope=conn.getScope(); 
} 

protected DemoJob(ISharedObject so) { 
    this.conn=Red5.getConnectionLocal(); 
    this.client=this.conn.getClient(); 
    this.so=so; 
    this.scope=conn.getScope(); 
} 

protected DemoJob() { 
    this.conn=Red5.getConnectionLocal(); 
    this.client=this.conn.getClient(); 
    this.scope=conn.getScope(); 
} 

} 

Puis j'ai créé une classe simple qui étend le précédent:

public class StartChallengeJob extends DemoJob { 

public void execute(ISchedulingService service) { 

    log.error("test"); 

} 

} 

Le problème est que mon application principale ne peut voir le constructeur sans aucun paramètre. avec des moyens que je peux faire new StartChallengeJob() pourquoi l'application principale ne voit-elle pas tous les constructeurs?

merci!

+0

L'application principale voit tous les constructeurs - constructeurs ne sont cependant pas des méthodes normales et ne sont pas propagés dans l'espace de nom de la classe enfant :) – extraneon

+0

Votre titre répond en fait à votre propre question. – DJClayworth

Répondre

8

Constructors ne sont pas héritées. StartChallengeJob efficacement ressemble à ceci:

public class StartChallengeJob extends DemoJob { 

    public StartChallengeJob() { 
    super(); 
    } 

    public void execute(ISchedulingService service) {  
    log.error("test"); 
    }  
} 

Si vous voulez toutes les signatures du constructeur superclasse soit disponible, vous aurez besoin d'avoir les constructeurs en StartChallengeJob aussi:

public class StartChallengeJob extends DemoJob { 

    public DemoJob (ISharedObject so, MysqlDb mysqldb) { 
    super(so, mysqldb); 
    } 

    public DemoJob (ISharedObject so) { 
    super(so); 
    } 

    public StartChallengeJob() { 
    super(); 
    } 

    public void execute(ISchedulingService service) {  
    log.error("test"); 
    }  
} 
4

Pour la classe StartChallengeJob indiquée dans votre question, le compilateur génère un constructeur par défaut, qui appelle implicitement le constructeur par défaut de la classe de base.

Si ce comportement par défaut n'est pas ce que vous voulez, vous devez définir explicitement un ou plusieurs constructeurs en StartChallengeJob, qui appellent alors le constructeur de classe de base désiré. Par exemple. si vous voulez les deux un défaut et un constructeur paramétrés, vous devez définir à la fois:

public class StartChallengeJob extends DemoJob { 

public StartChallengeJob(){ 
     // implicitly calls the base class default constructor: super(); 
} 

public StartChallengeJob (ISharedObject so, MysqlDb mysqldb){ 
     super(so, mysqldb); 
} 

public void execute(ISchedulingService service) { 

    log.error("test"); 

} 

} 
+0

merci beaucoup! :) – ufk

Questions connexes