Разве конструкторов абстрактного класса неявно не вызывают, когда производный класс инстанцируют?

Возьмите этот пример:

abstract class Base {
    function __construct() {
        echo 'Base __construct<br/>';
    }
}

class Child extends Base {
    function __construct() {
        echo 'Child __construct<br/>';
    }
}

$c = new Child();   

Происходя из среды C#, я ожидаю, что вывод будет

Основа __ конструкция
Ребенок __ конструкция

Однако эффективная выходная мощность справедлива

Ребенок __ конструкция

62
задан scottm 23 February 2010 в 19:21
поделиться

2 ответа

Я использовал подобную структуру для хранения данных о собственности, и я думаю, что это нормально, пока таблица останется относительно маленькой. Таблица entity-attribute-value ( EAV ), подобная этой, может занимать больше места и демонстрировать более низкую производительность запроса, чем традиционная таблица со структурой столбцов, но это не должно быть проблемой для набора свойств приложения разумного размера.

-121--3740404-

Как примерно

(angle % 360) - 179

Это на самом деле вернет другие результаты, чем наивный подход, представленный в вопросе, но он сохранит угол между указанными границами. (Я полагаю, что это может сделать это неправильным ответом, но я оставлю это здесь, если это решит аналогичную проблему других лиц).

-121--1310195-

Нет, конструктор родительского класса не вызывается, если дочерний класс определяет конструктор.

Из конструктора дочернего класса необходимо вызвать конструктор родительского класса:

parent::__construct();

При необходимости передайте ему параметры.

Как правило, вы будете делать это в начале конструктора дочернего класса, перед любым конкретным кодом; что означает, что в вашем случае у вас будет:

class Child extends Base {
    function __construct() {
        parent::__construct();
        echo 'Child __construct<br/>';
    }
}


И, для справки, вы можете взглянуть на эту страницу руководства PHP: Конструкторы и деструкторы - в ней указано (цитирование) :

Примечание: Родительские конструкторы не вызываются неявно, если дочерний класс определяет конструктор.
Для запустить родительский конструктор, вызов родитель:: __ конструкция () в пределах требуется дочерний конструктор.

104
ответ дан 24 November 2019 в 16:47
поделиться

Это выглядит хорошо: http://www.catonmat.net/blog/derivation-of-ycombinator/

-121--1032017-

Не так умно, но нет, если.

angle = (angle + 179)% 360 - 179;

Но я не уверен, как Java обрабатывает по модулю отрицательные числа. Это работает только в том случае, если -1 по модулю 360 равно 359.

UPDATE

Только что проверил документы и a% b дает значение между - (| b | - 1) и + (| b | - 1) , поэтому код нарушен . Для учета отрицательных значений, возвращаемых оператором по модулю, необходимо использовать следующее.

angle = ((angle + 179) % 360 + 360) % 360 - 179;

Но... нет... никогда... Используйте нечто подобное исходному решению, но фиксированное для значений меньше -179.

-121--1310203-

Ну, я только что нашел это в документах :

Примечание: Родительские конструкторы не являются вызывается неявно, если дочерний класс определяет конструктор. Для выполнения родительский конструктор, вызов Parent::__construct () внутри ребенка требуется конструктор.

6
ответ дан 24 November 2019 в 16:47
поделиться
Другие вопросы по тегам:

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