Java: не может использовать конструкторы в абстрактном классе - PullRequest
2 голосов
/ 04 мая 2010

Я создал следующий абстрактный класс для планировщика заданий в red5:

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

}

Затем я создал простой класс, который расширяет предыдущий:

public class StartChallengeJob extends DemoJob {

 public void execute(ISchedulingService service) {

   log.error("test");

 }

}

Проблема в том, что мое основное приложение может видеть только конструктор без каких-либо параметров. со средствами, которые я могу сделать new StartChallengeJob() почему основное приложение не видит все конструкторы?

спасибо!

Ответы [ 2 ]

8 голосов
/ 04 мая 2010

Конструкторы не наследуются. StartChallengeJob эффективно выглядит так:

public class StartChallengeJob extends DemoJob {

  public StartChallengeJob() {
    super();
  }

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

Если вы хотите, чтобы все сигнатуры конструктора суперкласса были доступны, вам понадобятся эти конструкторы и в StartChallengeJob:

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 голосов
/ 04 мая 2010

Для класса StartChallengeJob, показанного в вашем вопросе, компилятор создает конструктор по умолчанию, который неявно вызывает конструктор по умолчанию базового класса.

Если это поведение по умолчанию не то, что вам нужно, вам нужно явно определить один или несколько конструкторов в StartChallengeJob, которые затем вызывают требуемый конструктор базового класса. Например. если вы хотите и по умолчанию и параметризованный конструктор, вам нужно определить оба:

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");

 }

}
...