Дополнительную информацию см. в статье wikipedia .
Вы не можете. Это иногда - боль, но Вы не были бы в состоянии назвать его с помощью нормальных методов так или иначе.
В сообщении в блоге я предложил статические интерфейсы , который только был бы применим в универсальных ограничениях типа - но мог быть действительно удобным, IMO.
Одна точка о том, если бы Вы могли , определяет конструктора в интерфейсе, Вы испытали бы затруднения при получении классов:
public class Foo : IParameterlessConstructor
{
public Foo() // As per the interface
{
}
}
public class Bar : Foo
{
// Yikes! We now don't have a parameterless constructor...
public Bar(int x)
{
}
}
Вы не можете.
Интерфейсы определяют контракты, которые другие объекты реализуют и поэтому не имеют никакого состояния, которое должно быть инициализировано.
, Если у Вас есть некоторое состояние, которое должно быть инициализировано, необходимо рассмотреть использование абстрактного базового класса вместо этого.
Вы не делаете.
конструктор является частью класса, который может реализовать интерфейс. Интерфейс является просто контрактом методов, которые должен реализовать класс.
Не возможно создать интерфейс, который определяет конструкторов, но возможно определить интерфейс, который вынуждает тип иметь paramerterless конструктора, хотя быть этим очень ужасный синтаксис, который использует дженерики... Я на самом деле не так уверен, что это - действительно хороший шаблон кодирования.
public interface IFoo<T> where T : new()
{
void SomeMethod();
}
public class Foo : IFoo<Foo>
{
// This will not compile
public Foo(int x)
{
}
#region ITest<Test> Members
public void SomeMethod()
{
throw new NotImplementedException();
}
#endregion
}
, С другой стороны, если Вы хотите протестировать, если тип имеет paramerterless конструктора, можно сделать то отражение использования:
public static class TypeHelper
{
public static bool HasParameterlessConstructor(Object o)
{
return HasParameterlessConstructor(o.GetType());
}
public static bool HasParameterlessConstructor(Type t)
{
// Usage: HasParameterlessConstructor(typeof(SomeType))
return t.GetConstructor(new Type[0]) != null;
}
}
Hope это помогает.
xargs
имеет немного больше силы для более сложного использования.
– Orbling
22 November 2010 в 20:28