Bueno, creo que debería permitirse en el caso de un parámetro de tipo genérico. Probablemente simplificó la clase contractual de singleton. Aquí está un ejemplo:
public interface IEntity {
// some constrains...
DataRow ObjToRow(object obj);
object RowToObj(DataRow dr);
}
//T would be any class inherites from IEntity with default contructor signature.
public interface IMyContract {
T read<T>() where T : IEntity;
void write<T>(T object) where T : IEntity;
}
//everything in the class is static
public static class SqlProvider : IMyContract {
public static T read<T>() where T: IEntity {
DataRow dr = [reading from database]
return T.RowToObj(dr);
}
//compile error here....
public static void write<T>(T obj) where T : IEntity {
DataRow dr = T.ObjToRow(obj);
[ ... commit data row dr to database ... ]
}
}
public static class MyAppleEntity : IEntity {
[... implement IEntity contract normally ... ]
}
public static class MyOrangeEntity : IEntity {
[... implement IEntity contract normally ... ]
}
public class MyTest {
void reading() {
MyAppleEntity apple = SqlProvider.Read<MyAppleEntity>();
MyOrangeEntity orange = SqlProvider.Read<MyOrangeEntity>();
SqlProvider.write<MyAppleEntity>(apple);
SqlProvider.write<MyOrangeEntity>(orange);
}
}
La única vez que una referencia de tipo implícita está en el SqlProvider.read() y write() y T es la identidad así en el punto de invocación. Sin la implementación estática de la interfaz, me veo obligado a escribir así.
public class MyAppleEntity : IEntity {
[... implement IEntity contract normally ... ]
}
.....
public T read<T>() where T: IEntity, new() {
DataRow dr = [reading from database]
return new T().RowToObj(dr);
}
Muy poco diferente, pero no del todo elegante.
No tiene sentido. ¿Cómo implementarías la interfaz en una clase derivada de XXX? Sin embargo, no hay ninguna razón por la que no pueda llamar al miembro estático de la implementación. – leppie
http://stackoverflow.com/questions/259026/why-doesnt-c-allow-static-methods-to-implement-an-interface – bernhof
@leppie, usted ** podría ** tener un "método de tipo"; donde no había un 'this' implícito, pero resolvió el método en tiempo de ejecución del tipo. Sin embargo, las raras ocasiones en que se usarían pueden ser atendidas por métodos de instancia o por reflexión, por lo que no es necesario presionar la OMI. –