gpt4 book ai didi

c# - 代码契约和继承问题,什么去哪里?

转载 作者:太空狗 更新时间:2023-10-29 18:16:41 25 4
gpt4 key购买 nike

我可能误解了代码契约,但这是我的情况。

我有以下代码:

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

我正在尝试添加一个相对简单的契约(Contract):Contract.Requires (id != 0); ,我希望它在 Fetch 上得到验证.当我将它直接添加到 Fetch 时,我收到了 Method Fetch(int id) implements interface 3rdParty.IFetch<User> and thus cannot add Requires 的警告.

我创建了一个实现 IFetch 的抽象代码契约(Contract)类,并使用 ContractClass 将其指向/指向 UserFetch和 ContractClassFor分别属性。我仍然收到类似 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. 的错误但是,由于 3rdParty.IFetch 是一个泛型类型,我认为我无法专门为其制定代码契约。

问题是否已经明确,如果是,我该如何解决?

最佳答案

需要创建一个抽象类来实现合约,例如:

[ContractClassFor(typeof(IFetch<>))]
public abstract class ContractClassForIFetch<T> : IFetch<T>
{
public T Fetch(int id)
{
Contract.Requires(id != 0);
return default(T);
}
}

并将以下 ContractClass 属性添加到 IFetch:

[ContractClass(typeof(ContractClassForIFetch<>))]
public interface IFetch
{
T Fetch(int id);
}

关于c# - 代码契约和继承问题,什么去哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8843931/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com