Конструкторы и наследование

Имя вашего файлового поля - userfile, а в бэкэнде php вы вызываете файловое поле, поэтому вы получаете сообщение об ошибке. Измените свой бэкэнд на

move_uploaded_file(

Имя вашего файлового поля - userfile, а в бэкэнде php вы вызываете файловое поле, поэтому вы получаете сообщение об ошибке. Измените свой бэкэнд на

[110]

Он будет работать на вашем Ajax, и все работает нормально.

FILES['userfile']['tmp_name']

Он будет работать на вашем Ajax, и все работает нормально.

14
задан Péter Török 28 June 2010 в 15:48
поделиться

10 ответов

Конструкторы весьма наследуемы, потому что это могло бы вызвать странное и непреднамеренное поведение. Строго говоря, если Вы добавили нового конструктора к базовому классу, все производные классы получают экземпляр того конструктора. Это - плохая вещь в некоторых случаях, потому что, возможно, Ваш базовый класс указывает параметры, которые не имеют смысла для Ваших производных классов.

Обычно даваемый пример для этого - то, что на многих языках, базовый класс для всех объектов (обычно названный "Объектом") имеет конструктора без параметров. Если бы конструкторы были наследованы, то это означало бы, что все объекты имеют конструктора без параметров, и нет никакого способа сказать, что "Я хочу людей, которые делают экземпляр этого класса для обеспечения параметров X, Y и Z, иначе их код не должен компилировать". Для многих классов важно, чтобы определенные параметры были определены для их надлежащей функции, и ненаследуемые конструкторы создания являются частью способа, которым авторы класса могут гарантировать, что некоторые параметры всегда определяются.

Редактирование для ответа на комментарии: Ramesh указывает, что, если бы конструкторы были наследованы, поскольку он хотел бы, чтобы они были, он мог всегда переопределять конструкторов базового класса, использующих конфиденциально объявленных конструкторов в каждом производном классе. Это, конечно, верно, но там это логистическая проблема с этой стратегией. Это требует, чтобы писатели производных классов наблюдали базовые классы тесно и добавить частного конструктора, если они хотят наследование блока конструктора базового класса. Не только это большая работа для людей, пишущих производные классы, этот вид неявной зависимости через классы является точно видом вещи, которая может вызвать странное поведение.

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

Quintin Robinson обеспечивает некоторые очень стоящие ответы на этот вопрос в комментариях, которые определенно стоит прочитать.

16
ответ дан 1 December 2019 в 08:43
поделиться

Они (через объединение в цепочку), необходимо было бы объединить конструктора в цепочку в производном объекте.. IE:

public class Foo
{
    public Foo() { }
    public Foo(int j) { }
}

public class Bar : Foo
{
    public Bar() : base() { }
    public Bar(int j) : base(j) { }
}

Конструкторы в производных объектах затем объединят вызовы в цепочку, делают конструкторов в базовых объектах.

Эта статья предоставляет еще некоторые примеры, если Вы хотите дополнительные материалы для чтения.

8
ответ дан 1 December 2019 в 08:43
поделиться

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

public class FooRepository
{
    public FooRepository(IDbConnection connection) { ... }
}

Если бы все общедоступные конструкторы от базовых классов были доступны, то пользователь Вашего класса репозитория смог бы использовать Систему. Конструктор по умолчанию объекта для создания недопустимого экземпляра класса:

var badRepository = new FooRepository();

Сокрытие наследованных конструкторов средствами по умолчанию, которые можно осуществить зависимости, не волнуя по поводу пользователей, создающих "недопустимые" экземпляры.

2
ответ дан 1 December 2019 в 08:43
поделиться

Предположим, что конструкторы были наследуемыми. Как Вы отключили бы наследованных конструкторов во многих случаях, были, они не имеют смысла для подкласса?

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

2
ответ дан 1 December 2019 в 08:43
поделиться

Foo конструктор может только знать, как инициализировать объект Foo, таким образом, он не имеет никакого смысла, который он должен также знать, как инициализировать любой потенциальный подкласс

public class Bar : Foo
{
public Bar(int i) : base(i) { }
}

История, которую рассказывает конструктор: "Эй базовый класс сделайте любую работу, которую необходимо сделать, чтобы быть в хорошем состоянии так, чтобы я мог идти вперед и собраться правильно".

2
ответ дан 1 December 2019 в 08:43
поделиться

Конструкторы весьма наследуемы по причинам дизайна. (Обратите внимание, что это - та же ситуация на каждом объектно-ориентированном языке, о котором я знаю.) Простой ответ - то, что во многих случаях Вы действительно не хотели бы, чтобы те же конструкторы как базовый класс были доступны. Посмотрите, что это ТАК распараллеливает еще для некоторых полных объяснений.

1
ответ дан 1 December 2019 в 08:43
поделиться

Некоторые обсуждения

Основная идея состоит в том, чтобы предоставить как можно больше управления создателю. И у Вас могут быть частные основания. Как Вы создали бы объект затем?

1
ответ дан 1 December 2019 в 08:43
поделиться

Я думаю, что можно сделать следующее:

public class Bar : Foo
{
  public Bar (int i)
    : base (i)
  {
  }
}

Я могу быть немного прочь - но это - общее представление.

0
ответ дан 1 December 2019 в 08:43
поделиться

Простой ответ - то, что язык не прокладывает себе путь.

Реальный вопрос, который Вы задаете для того, хотя то, почему он не прокладывает себе путь :-) Хорошо это - произвольный выбор, и это следует за C++ и Java (и очень возможно много других языков, которые влияли на C#).

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

0
ответ дан 1 December 2019 в 08:43
поделиться

Действительно, потому что родительский конструктор не полностью инициализировал бы дочерний объект. Конструктор является своего рода персональной вещью в этом отношении. Вот почему большинство языков не наследовало конструкторов.

0
ответ дан 1 December 2019 в 08:43
поделиться
Другие вопросы по тегам:

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