Podría estar malinterpretando contratos de código, pero esta es mi situación.Código de contratos y problemas de herencia, ¿qué va a dónde?
Tengo el siguiente código:
interface IFetch<T> // defined in another DLL
{
T Fetch(int id);
}
interface IUserFetch : IFetch<User>
{
IEnumerable<User> GetUsersLoggedIn();
}
class UserFetch : IUserFetch
{
public User Fetch(int id)
{
return (User) Database.DoStuff (id);
}
public IEnumerable<User> GetUsersLoggedIn()
{
return (IEnumerable<User>) Database.DoMoreStuff();
}
}
Estoy intentando añadir un contrato relativamente simple: Contract.Requires (id != 0);
, y lo quiero validado en Fetch
. Cuando lo agregue directamente a Fetch, aparece la advertencia que dice Method Fetch(int id) implements interface 3rdParty.IFetch<User> and thus cannot add Requires
.
Creé una clase abstracta de contratos de código implementando IFetch y la apunté a/desde UserFetch usando los atributos ContractClass
y ContractClassFor
respectivamente. Todavía obtengo un error como CodeContracts: The class 'FetchUserContracts' is supposed to be a contract class for '3rdParty.IFetch<User>', but that type does not point back to this class.
Sin embargo, dado que 3rdParty.Fetch es un tipo genérico, no creo que pueda ponerle un código específico.
¿Se ha aclarado el problema? Si es así, ¿cómo lo resuelvo?
Posible duplicado: http://stackoverflow.com/questions/3414586 –
@RobertHarvey: Lo tomaré principalmente, excepto que mi problema parece provenir más de los genéricos –