В Java, почему я не могу объявить заключительного участника (w/o инициализация его) в родительском классе и установить его значение в подклассе? Как я могу работать вокруг?

module.exports.listGames = (id) => {
  let query = 'SELECT * FROM test';
  if (id) {
    query += 'WHERE userid = ' + connection.escape(id);
  }

  connection.query(query, function(err, results) {
    if (err) {
      throw err;
    }
    return (results);
  });
}

Объявите функцию javascript async и вызовите метод отсюда.

async function  sendGames (req, res) {
    var games = await db.listGames(req.query.game);
    res.json(games);
}
10
задан Hanno Fietz 19 March 2009 в 18:45
поделиться

8 ответов

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

public abstract class Parent {
    protected final String birthmark;
    protected Parent(String s) {
        birthmark = s;
    }
}

public class Child extends Parent {
    public Child(String s) {
        super(s);
        ...
    }
}
19
ответ дан 3 December 2019 в 14:54
поделиться

Передайте его родительскому конструктору:

public abstract class Parent {
    private final String birthmark;
    public Parent(String s) {
        birthmark = s;
    }
}

public class Child extends Parent {
    public Child(String s) {
        super(s);
    }
}
7
ответ дан 3 December 2019 в 14:54
поделиться

Другой выход Java способ сделать это должно, вероятно, иметь родительский класс, чтобы определить абстрактный "метод считывания" и сделать, чтобы дети реализовали его. Это не отличный способ сделать это в этом случае, но это в некоторых случаях это может быть точно, что Вы хотите.

2
ответ дан 3 December 2019 в 14:54
поделиться

Я сделал бы это как это:

public abstract class Parent 
{
    protected final String birthmark;

    protected Parent(final String mark)
    {
        // only if this makes sense.
        if(mark == null)
        {
            throw new IllegalArgumentException("mark cannot be null");
        }

        birthmark = mark;
    }
}

public class Child 
    extends Parent 
{
    public Child(final String s) 
    {
        super(s);
    }
}

финал означает, что переменная может быть инициализирована однажды на экземпляр. Компилятор не может удостовериться, что каждый подкласс обеспечит присвоение на родинку, таким образом, это вынудит присвоение произойти в конструкторе родительского класса.

Я добавил проверку пустой указатель только, чтобы показать, что Вы также извлекаете пользу из способности проверить аргументы в одно место, а не каждого конструктора.

2
ответ дан 3 December 2019 в 14:54
поделиться

Почему бы не делегировать инициализацию к методу. Затем переопределите метод в родительском классе.

public class Parent {
   public final Object x = getValueOfX();
   public Object getValueOfX() {
      return y;
   }
}
public class Child {
  @Override
  public Object getValueOfX() {
     // whatever ...
  }
}

Это должно позволить пользовательскую инициализацию.

1
ответ дан 3 December 2019 в 14:54
поделиться

Да, заключительным участникам нужно присвоить в классе, в котором они объявляются. Необходимо добавить конструктора с Аргументом строки для Порождения.

0
ответ дан 3 December 2019 в 14:54
поделиться

Объявите конструктора в суперклассе, которым это называет подкласс. Необходимо установить поле в суперклассе, чтобы удостовериться, что это инициализируется, или компилятор не может быть уверен, что поле инициализируется.

0
ответ дан 3 December 2019 в 14:54
поделиться

Вы, вероятно, хотите иметь Родителя (Строковая родинка) конструктор так, чтобы можно было удостовериться в Родительском классе, что финал всегда инициализируется. Затем можно назвать супер (родинка) от Ребенка () конструктор.

0
ответ дан 3 December 2019 в 14:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: