Możliwe, że nie rozumiem umów na kod, ale oto moja sytuacja.Kontrakty dotyczące kodu i problemy związane z dziedziczeniem, co dalej?
Mam następujący kod:
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();
}
}
Próbuję dodać stosunkowo prostą umowę: Contract.Requires (id != 0);
, i chcę to potwierdzone na Fetch
. Kiedy dodaję go bezpośrednio do Fetch, otrzymuję ostrzeżenie o Method Fetch(int id) implements interface 3rdParty.IFetch<User> and thus cannot add Requires
.
Utworzono abstrakcyjną klasę kontraktów kodu implementującą IFetch i wskazałem ją do/z UserFetch, używając odpowiednio atrybutów ContractClass
i ContractClassFor
. Nadal dostaję błąd taki jak 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.
Jednak ponieważ 3rdParty.IFetch jest typem ogólnym, nie sądzę, abym kiedykolwiek mógł w tym celu zawrzeć umowę kodu.
Czy problem został jasno, a jeśli tak, to jak mogę go rozwiązać?
Prawdopodobny duplikat: http://stackoverflow.com/questions/3414586 –
@RobertHarvey: W większości przypadków biorę to pod uwagę, ale mój problem wydaje się być bardziej związany z rodzajami leków –