468 votos

La interfaz de la definición de un constructor de la firma?

Es raro que esta es la primera vez que me he topado con este problema, pero:

¿Cómo se puede definir un constructor en C# interface?

Editar
Algunas personas querían un ejemplo (es un tiempo libre proyecto, así que sí, es un juego)

IDrawable
+Actualización
+Sorteo

Ser capaz de Actualizar (asegúrese de que el borde de la pantalla, etc) y dibujar a sí misma siempre va a necesitar un GraphicsDeviceManager. Así que quiero asegurarme de que el objeto tiene una referencia a él. Este pertenecerían al constructor.

Ahora que escribí esto, pienso que lo estoy implementando aquí es IObservable y a las GraphicsDeviceManager debe tomar la IDrawable... Parece que yo no obtenga el XNA framework, o el marco no está pensado muy bien.

Editar
Parece que hay cierta confusión acerca de mi definición de constructor en el contexto de una interfaz. Una interfaz puede, de hecho, no se ejecutarán de modo que no requiere de un constructor. Lo que yo quería para definir era una firma a un constructor. Exactamente igual que una interfaz puede definir una firma de un determinado método, la interfaz podría definir la firma de un constructor.

299voto

Jon Skeet Puntos 692016

No se puede. Es en ocasiones un dolor, pero usted no será capaz de llamar usando técnicas normales de todos modos.

En un post en el blog me he propuesto estática interfaces que sólo será utilizable en genérico restricciones de tipo, pero podría ser realmente útil, de la OMI.

Un punto acerca de si podría definir un constructor dentro de una interfaz, tendrías problemas derivados de las clases:

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)
    {
    }
}

131voto

Gert Arnold Puntos 27642

Un final de contribución demostrar otro problema con la interfaz de constructores. (Elijo esta pregunta, ya que tiene la más clara articulación del problema). Supongamos que podría tener:

interface IPerson
{
    IPerson(string name);
}

interface ICustomer
{
    ICustomer(DateTime registrationDate);
}

class Person : IPerson, ICustomer
{
    Person(string name) { }
    Person(DateTime registrationDate) { }
}

Donde por convención, la aplicación de la "interfaz de constructor" es reemplazado por el nombre del tipo.

Ahora hacer un ejemplo:

ICustomer a = new Person("Ernie");

Podríamos decir que el contrato ICustomer sea obedecida?

Y lo que acerca de esto:

interface ICustomer
{
    ICustomer(string address);
}

57voto

Michael Puntos 34110

No se puede.

Interfaces de definir los contratos que otros objetos de implementar y por lo tanto no tienen ningún estado que debe ser inicializado.

Si tienes algún estado que debe ser inicializado, usted debe considerar el uso de una clase base abstracta en su lugar.

19voto

Jeroen Landheer Puntos 3346

No es posible crear una interfaz que define los constructores, pero es posible definir una interfaz que obliga a un tipo para tener una paramerterless constructor, a pesar de ser muy feo sintaxis que utiliza los medicamentos genéricos... realmente no estoy tan seguro de que es realmente un buen patrón de codificación.

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
}

Por otro lado, si quieres probar si un tipo tiene un paramerterless constructor, usted puede hacer que el uso de la reflexión:

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;
  }
}

Espero que esto ayude.

19voto

Jeroen Landheer Puntos 3346

Estaba mirando hacia atrás en esta cuestión y me dije a mí mismo, tal vez son accesos a este problema de la manera equivocada. Interfaces podría no ser el camino a seguir cuando se trata de definir un constructor con ciertos parámetros... pero un (abstracta) de la clase base.

Si crea una base de clase con un constructor que hay que acepta los parámetros que necesita, cada clase que derrives del que necesita para abastecer a ellos.

public abstract class Foo
{
  protected Foo(SomeParameter x)
  {
    this.X = x;
  }

  public SomeParameter X { get; private set }
}

public class Bar : Foo // Bar inherits from Foo
{
  public Bar() 
    : base(new SomeParameter("etc...")) // Bar will need to supply the constructor param
  {
  }
}

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X