Класс не содержит конструктор, который принимает 0 аргументов [duplicate]

Есть несколько способов:

import { not, equal } from '@ember/object/computed';

// ...

isPizza: equal('controllers.application.currentRouteName', 'pizza'),
isNotPizza: not('isPizza'),

или вы можете сделать неравное, выполнив:

import { not, equal } from '@ember/object/computed';

isNotPizza: not(equal('controllers.application.currentRouteName', 'pizza')),

Возможно, вам понадобится использовать это: https: //github.com/kellyselden/ember-macro-helpers не помню, поддерживается ли это изначально.

Если вы оказались на угасающей канарейке (используя нативные классы и декораторы), вы можете сделать:

@not
@equal('controllers.application.currentRouteName', 'pizza')
isNotPizza;

29
задан 15.05.2020, 23:22

6 ответов

Ошибка говорит вам, что конструктор Malicious не может найти подходящий конструктор для цепочки в своем базовом классе (MaliciousSmall).

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

public Malicious() : base()
{
}

Или даже когда вы добавили явный конструктор, он все еще пытается объединиться в цепочку без параметров:

public Malicious(DataRow row) : base()
{
}

... но в нет такого беспараметрического конструктора в базовом классе (MaliciousSmall), следовательно, ошибка.

Я думаю, что вы хотите связать конструктор со строкой (та, которую вы объявили в MaliciousSmall):

public Malicious(DataRow row) : base(row)
{
}

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

public MaliciousSmall()
{
    // Set fields/properties to some default values
}

Возможно, вы захотите Ваш производный класс должен иметь два конструктора:

public Malicious() // Implicitly chain to the parameterless base constructor
{
}

public Malicious(DataRow row) : base(row) // Chain to parameterized constructor
{
}

См. мою статью о построении цепочек для более подробной информации.

85
ответ дан 15.05.2020, 23:23
  • 1
    Hadn' t заметил, что Ваш комментарий был также ответом, мой комментарий в другом месте применяется: stackoverflow.com/questions/3611843/… – Blaisorblade 20.10.2019, 16:00
  • 2
    Хорошо, отлично, tnx так много, теперь я тоже буду читать вашу статью – AndreaNobili 15.05.2020, 23:23
  • 3
    Так что вы говорите мне, что, делая публичное Malicious (строка DataRow): base (row), я выполняю переопределение конструктора MaliciousSmall, который есть в моем конструкторе Malicious? – AndreaNobili 15.05.2020, 23:24
  • 4
    @AndreaNobili: Конструкторы не являются виртуальными - вы не переопределяете их. Однако каждому конструктору необходимо связать с другим конструктором в том же классе или с конструктором в базовом классе - этот цепочечный конструктор выполняется перед телом конструктора, который выполняет связывание. Этот код цепочки от конструктора Malicious(DataRow) к конструктору MaliciousSmall(DataRow). Прочитайте статью, на которую я ссылаюсь, внизу моего ответа. – Jon Skeet 15.05.2020, 23:24
  • 5
    @AndreaNobili, it' s стоящий для чтения статьи Jon Skeets о том, как конструкторы работают, если Вы собираетесь сделать программирование C#. Он упомянул его кратко ниже его ответа: yoda.arachsys.com/csharp/constructors.html – John Korsnes 15.05.2020, 23:25
  • 6
    @hijarian Нисколько. Если бы Вы явно пишете, что конструктор не по умолчанию, генерируя конструктора по умолчанию был бы точно неправильный поступок . Это позволило бы любому потребителю Вашего класса полностью обойти инварианты you' ve попытался поместить на месте. – Chris Hayes 15.05.2020, 23:25

Если вы не хотите добавлять конструктор без параметров, передайте row в конструктор класса base :

public Malicious(DataRow row):base(row)
{ 

}
3
ответ дан 15.05.2020, 23:23
  • 1
    PHP находится на стороне сервера – opengrid 31.12.2019, 18:10

Если вы производите какой-либо класс из базового класса, то вам следует либо добавить конструктор без параметров в базовый класс, либо указать конструктор базового класса, который будет вызываться в производном классе. Итак, чтобы решить вашу проблему: Решение 1: Добавьте конструктор без параметров в базовый класс, т.е. в MaliciousSmall as,

public MaliciousSmall()
{
}

Решение 2: Укажите конструктор базового класса в конструкторе производного класса как,

public DataRow row;
public Malicious: base(row)
{
}

Надеюсь, это поможет вам!

2
ответ дан 15.05.2020, 23:24

Я попытался создать пустой конструктор, который будет принимать объект DataRow в качестве параметра

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

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

public Malicious(DataRow row)
    : base(row)
{
}
7
ответ дан 15.05.2020, 23:25
  • 1
    Я заметил также, что config.js необходим для require.js оптимизатора для работы без ошибок. Объясните, почему Вы предлагаете добавить другой слой с помощью globals.js. – opengrid 31.12.2019, 18:07

Ваш класс Malicious вообще не определил никакого конструктора, и из документов MSDN по использованию конструкторов

Если класс не является статическим, классы без конструкторы получают открытый конструктор по умолчанию от компилятора C #, чтобы включить создание экземпляров класса.

Это означает, что ваш класс имеет:

public class Malicious : MaliciousSmall
{
   public Malicious()
   {
   }
}

Из той же ссылки MSDN

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

Это фактически означает:

   public Malicious() :base() //implicitly calling base class constructor

Так как ваш базовый класс не имеет конструктора по умолчанию (без параметра) , вы получите ошибку.

Теперь у вас есть две возможности исправить эту ошибку.

  1. Определите конструктор по умолчанию в вашем базовом классе.
  2. Явно вызовите базовый конструктор из вашего производного класса.

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

public Malicious(DataRow row) :base(row)
4
ответ дан 15.05.2020, 23:25
  • 1
    @opengrid - that' s, почему it' s в < script> тег – Peter Davis 31.12.2019, 18:10

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

class MaliciousSmall
{
    //if no constructors are defined then compiler adds the following
    //public MaliciousSmall()
}

class Malicious: MaliciousSmall
{
    //if no constructors are defined then compiler adds the following
    //public Malicious() : base()
}

Malicious obj = new Malicious();

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

class MaliciousSmall
{
    public MaliciousSmall(DataRow row)
    {
        //compiler will not supply a default constructor
    }
}

class Malicious: MaliciousSmall
{
    //if no constructors are defined then compiler adds the following
    //public Malicious() : base()
}

Malicious obj = new Malicious();

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

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

class MaliciousSmall
{
    public MaliciousSmall()
    {
        //
    }

    public MaliciousSmall(DataRow row)
    {
        //
    }
}

class Malicious:MaliciousSmall
{
    public Malicious()
    {
        //
    }

    public Malicious(DataRow row):base(row)
    {
        //
    }
}

Malicious obj = new Malicious();

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

0
ответ дан 15.05.2020, 23:26
  • 1
    В то время как это работало бы (как будет глобальное, на исходный вопрос), он противоречит философии AMD. Модуль AMD должен объявить все свои зависимости и идеально не полагаться на globals, который " document" конечно, (используется $ для поиска HTML). – Peter Davis 31.12.2019, 18:08

Теги

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