Можем ли мы иметь 2 супервызов в конструкторе дочерних классов? [Дубликат]

Я столкнулся с подобным вопросом и просто хотел добавить то, на что я остановился. Мне понравился reindex_axis() method для изменения порядка столбцов. Это сработало:

df = df.reindex_axis(['mean'] + list(df.columns[:-1]), axis=1)

Альтернативный метод, основанный на комментарии от @Jorge:

df = df.reindex(columns=['mean'] + list(df.columns[:-1]))

Хотя reindex_axis кажется немного более быстрым в микро-тестах, чем reindex , Я думаю, что я предпочитаю последнее за его прямоту.

10
задан informatik01 29 August 2017 в 16:38
поделиться

4 ответа

Что вы должны сделать:

Добавить конструктор в ваш суперкласс:

public Superclass {
    public SuperClass(String flavour) {
       // super class constructor
       this.flavour = flavour;
    }
}

В классе Crisps:

public Crisps(String flavour, int quantity) {
    super(flavour); // send flavour to the super class constructor
    this.quantity = quantity;
}

& nbsp;

Комментарии

Некоторые комментарии к вашему вопросу:

«В суперклассе я инициализировал поле с помощью«

private String flavour;

не является инициализацией, это декларация. Инициализация - это когда вы устанавливаете значение.

«Я получаю сообщение об ошибке» имеет личный доступ в суперклассе », но я считаю, что это не имеет значения, поскольку я вызываю метод доступа, который возвращает его поле? "

Когда вы вызываете аксессуар (aka getter), это нормально - зависит от видимости геттера. Проблема в вашем коде:

this.flavour = 

, потому что аромат не является полем, объявленным в классе Crisps, но в классе ужина, поэтому вы не можете делать прямой доступ. вы должны использовать мое предложение или объявить сеттера в суперклассе:

public void setFlavour(String flavour) {
    this.flavour = flavour;
}

Затем вы можете использовать его в дочернем классе:

public Crisps(String flavour, int quantity) {
    this.quantity = quantity;
    super.setFlavour(flavour);
}
17
ответ дан lpinto.eu 16 August 2018 в 11:41
поделиться
  • 1
    @ ipinto.eu, в то время как ваш ответ верен, и поэтому ваше решение, ваше последнее альтернативное решение в вашем ответе (используя сеттеры суперкласса), я полагаю, нарушает правило наследования, поскольку оно даст вызов « Overridable method в конструкторе " проблема. Следовательно, последнее альтернативное решение не является реальным решением, но приведет к ошибкам в коде. Я думаю, super.setFlavour (flavor) должен работать. – Sajib Acharya 27 July 2017 в 13:54
  • 2
    Я понимаю и согласен; Должен сказать, пример был для обсуждения. Мне нравится ваше предложение назвать его с помощью super, Другие варианты (и другая философия) - сделать ваши сеттеры окончательными (невозможно переопределить). – lpinto.eu 27 July 2017 в 18:00

сделать

    private String flavour;

общедоступным, иначе ваши подклассы не будут иметь доступ к этой строке. Ваш суперкласс не знает о существовании какого-либо подкласса. Согласно документации Java, «private» делает любую переменную и метод доступными в этом классе, где была объявлена ​​приватная переменная или метод, ни один класс не имеет к ней доступа, даже подклассы. После того, как вы воспользуетесь модификатором доступа, вы не получите никаких ошибок.

1
ответ дан Aida Isay 16 August 2018 в 11:41
поделиться

flavour является закрытым. Хотя вы читаете его из общедоступного метода, вы назначаете его частному полю и, скорее всего, не объявляете его в этом классе.

Вы можете настроить вкус protected в родительском классе или определить для него сеттер

. В конечном итоге ваш код на самом деле не имеет смысла. Даже если бы он скомпилировался, это было бы более или менее: flavour = flavour. Возможно, вам стоит пересмотреть то, что вы пытаетесь сделать немного

. Мне кажется, вам может понадобиться более пристальное понимание Java и объектно-ориентированного программирования.

http: // docs.oracle.com/javase/tutorial/java/concepts/

Вы должны начать здесь.

1
ответ дан Cruncher 16 August 2018 в 11:41
поделиться
  • 1
    хорошо, есть все равно, чтобы сделать это по вызову публичного метода getFlavour? – user215732 11 October 2013 в 21:06
  • 2
    @ пользователь215732 getFlavour делает как раз это. Он получает flavour. Вы не можете использовать это, чтобы присвоить значение вкусу. Если он возвращает изменчивый объект, вы можете изменить фактический вкус, но в этом случае строки являются неизменными. – Cruncher 11 October 2013 в 21:08
  • 3
    @ user215732 У вашего конструктора crisps есть параметр flavour, но вы ничего не делаете с ним, так как ваш код в настоящее время написан. – ajb 11 October 2013 в 21:09
  • 4
    @ user215732 Создайте сеттер public. – Sotirios Delimanolis 11 October 2013 в 21:10
  • 5
    @SotiriosDelimanolis Это наверняка будет забавно после того, как он добавит сеттера. super.setFlavour(super.getFlavour()); Конечно, сейчас это выглядит довольно забавно. – Cruncher 11 October 2013 в 21:12
public crisps(String flavour, int quantity)
{
    super(flavour);
    this.quantity = quantity;
}

Это должно работать как , см. Документы

1
ответ дан HansB 16 August 2018 в 11:41
поделиться
Другие вопросы по тегам:

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