Есть несколько способов:
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;
Ошибка говорит вам, что конструктор 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
{
}
См. мою статью о построении цепочек для более подробной информации.
Если вы не хотите добавлять конструктор без параметров, передайте row
в конструктор класса base :
public Malicious(DataRow row):base(row)
{
}
Если вы производите какой-либо класс из базового класса, то вам следует либо добавить конструктор без параметров в базовый класс, либо указать конструктор базового класса, который будет вызываться в производном классе. Итак, чтобы решить вашу проблему: Решение 1: Добавьте конструктор без параметров в базовый класс, т.е. в MaliciousSmall as,
public MaliciousSmall()
{
}
Решение 2: Укажите конструктор базового класса в конструкторе производного класса как,
public DataRow row;
public Malicious: base(row)
{
}
Надеюсь, это поможет вам!
Я попытался создать пустой конструктор, который будет принимать объект DataRow в качестве параметра
Я думаю, что вы неправильно запутали термин пустой . Пустой конструктор не принимает параметры по определению. У вас не может быть пустого конструктора с параметрами.
Если вы также хотите сохранить параметр в конструкторе производного класса, вам нужно использовать ключевое слово base
, чтобы указать базовый конструктор.
public Malicious(DataRow row)
: base(row)
{
}
Ваш класс Malicious
вообще не определил никакого конструктора, и из документов MSDN по использованию конструкторов
Если класс не является статическим, классы без конструкторы получают открытый конструктор по умолчанию от компилятора C #, чтобы включить создание экземпляров класса.
Это означает, что ваш класс имеет:
public class Malicious : MaliciousSmall
{
public Malicious()
{
}
}
В производном классе, если базовый Конструктор класса не вызывается явно с помощью ключевого слова
base
, конструктор по умолчанию, если он есть, называется неявно .
Это фактически означает:
public Malicious() :base() //implicitly calling base class constructor
Так как ваш базовый класс не имеет конструктора по умолчанию (без параметра) , вы получите ошибку.
Теперь у вас есть две возможности исправить эту ошибку.
Вероятно, для вашей ситуации лучше вызывать базовый конструктор явно, поскольку оба конструктора получают один и тот же параметр типа. Вы можете сделать:
public Malicious(DataRow row) :base(row)
Если в классе не определены конструкторы, компилятор предоставляет конструктор по умолчанию / без параметров, который используется для создания экземпляров соответствующих объектов, как показано ниже.
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
ключевое слово.
Malicious(DataRow)
к конструкторуMaliciousSmall(DataRow)
. Прочитайте статью, на которую я ссылаюсь, внизу моего ответа. – Jon Skeet 15.05.2020, 23:24