2010-04-16 16 views
7

estoy tratando de hacer lo siguiente:¿Por qué no puedo aplicar clases derivadas para tener constructores sin parámetros?

class Program 
{ 
    static void Main(string[] args) 
    { 
     foo<baz> fooObject = new foo<baz>(); 
     AnotherClass<baz> _baz = new AnotherClass<baz>(); 
     _baz.testMethod(fooObject); 
    } 
} 

public class AnotherClass<T> where T : bar 
{ 
    public void testMethod(foo<T> dummy) 
    { 
     foobar = dummy; 
    } 

    private foo<T> foobar = null; 
} 

public class foo<T> where T : bar, new() 
{ 
    public foo() 
    { 
     _t = new T(); 
    } 

    private T _t; 

} 

public abstract class bar 
{ 
    public abstract void someMethod(); 
    // Some implementation 
} 

public class baz : bar 
{ 
    public override void someMethod() 
    { 
     //Implementation 
    } 
}  

y me sale un error explicando que 'T' debe ser un tipo no abstracta con un constructor sin parámetros pública con el fin de utilizarlo como parámetro de 'T' en el tipo o método genérico Entiendo completamente por qué esto debe ser así, y también entiendo que podría pasar un objeto preinicializado de tipo 'T' como un argumento constructor para evitar tener que 'nuevo', pero ¿hay alguna forma de evitar esto? ¿Hay alguna forma de aplicar clases que se derivan de 'barra' para suministrar constructores sin parámetros?

Corregido - Me faltaba una 'nueva()' restricción en AnotherClass().

Respuesta

5

¿No te falta una nueva restricción() en su AnotherClass?

public class AnotherClass<T> where T : bar, new() 

Sin eso VS2010 se niega a compilar, con eso funciona muy bien.

+0

¡Gracias, parece que lo arregló! –

0

¿No es la sintaxis genérica nueva() en lugar de simplemente nueva?

También, que está haciendo este código en el medio de una clase en lugar de en una función, que está seguro de que el deflector:

_t = new T(); 

Editar:

Ok, así que después de la limpieza de la sintaxis, supongo que el problema es que 'baz' no tiene un constructor sin parámetros. No sé de ninguna manera en que puedas hacer cumplir esto.

Hay una pregunta similar here, que puede ayudar un poco.

+0

"En el medio de la clase": esta es solo una declaración de campo con un valor inicial. –

+0

Solucionado, gracias. ¡Mi mal hábito de medio pseudocódigo, código medio real! –

7

La sintaxis correcta es

public class foo<T> where T : bar, new() 
+0

Lo siento, lo escribí apurado. –

0

Como solución alternativa - Puede pasar delegado de la creación de la instancia de un tipo que necesita:

Func<T> creator = ... 

    _t = creator(); 
1

Su código se compila en VS2010.

Es posible que desee utilizar las interfaces en su lugar:

public class foo<T> where T : ibar, new() 
... 

public interface ibar 
{ 
    void someMethod(); 
} 

public abstract class bar : ibar 
{ 
    public abstract void someMethod(); 
    // Some implementation 
} 
+0

Esto genera el mismo problema para mí ... –

0

retire primero "nueva()" de la palabra clave "dónde" de la clase "Foo" Después debe alterar el constructor como

public foo() 
{ 
    _t = Activator.CreateInstance<T>(); 
} 

Para mí funcionó!

Cuestiones relacionadas