В C#, там способ осуществить это, класс ДОЛЖЕН иметь конструктора без параметров?
Если вы говорите об общих ограничениях, да:
class SomeContainer<T> where T : new() {
...
}
Если вы говорите о наследовании. Невозможно требовать, чтобы каждый класс, реализующий ваш интерфейс или наследующий ваш базовый класс, имел конструктор без параметров.
Лучшее, что вы можете сделать, - это использовать отражение в базовом конструкторе, чтобы генерировать исключение (во время выполнения), например:
abstract class MyBase {
protected MyBase() {
if (GetType().GetConstructor(Type.EmptyTypes) == null)
throw new InvalidProgramException();
}
}
Если вы говорите об одном классе, да; просто вставьте один.
Все зависит от того, что вы имеете в виду.
Например, вы можете ограничить параметр универсального типа в классе или методе конструктором без параметров с помощью ключевого слова new
, но нет реального метода ограничения фактического определения класса за пределами что.
public void DoSomething<T>() where T : new() { }
Я сталкивался с подобной проблемой несколько раз, я думаю, что есть требование для абстрактных/интерфейсных конструкторов. Проблема возникает, когда вы используете Activator.CreateInstance
или какую-то другую технику для инстанцирования типа, который вы можете не реализовать (довольно распространенный IoC). Жизнь была бы намного проще, если бы вы могли заставить разработчика реализовать конструктор с нужными параметрами - даже если цель состоит в том, чтобы просто передать параметры базовому конструктору.
Ограничение new()
немного помогло решить эту проблему с версии 2.0, но оно все еще не решает проблему, если вы не используете дженерики, или если вам нужны конкретные аргументы (и вы не хотите возиться с неудобным ConstructorInfo, который нельзя проверить статически)
Как упоминалось в официальной документации MSDN, компилятор C # автоматически генерирует конструктор без параметров, который инициализирует все переменные-члены значениями по умолчанию. Если вы хотите применить свою собственную реализацию, вы можете просто сделать это:
class BaseClass { BaseClass () {// Реализация конструктора без параметров} }
Если вы имеете в виду общие ограничения, обратитесь к сообщению SLaks.
Ссылки
Generics может обеспечить это, но мы не всегда используем generics ;p
Если вы используете модульные тесты, вы можете использовать отражение, чтобы найти все типы, которые соответствуют шаблону, который вы хотите, чтобы иметь конструкторы без параметров (например, все производные от MyBaseObject
, или все в Foo. Bar
), и проверьте этот способ (путем нахождения конструктора без параметров).
Если вы хотите утверждать это и во время выполнения (возможно, в #DEBUG
), такие вещи, как статические конструкторы, могут быть полезными точками для введения дополнительных проверок типов.