c#接口具有相同的方法名

本文关键字:方法 接口 | 更新日期: 2023-09-27 18:09:33

我不知道我想做的事情是不可能的,还是我没有以正确的方式思考。

我正在尝试构建一个接受泛型类型的存储库接口类,并将其用作其大多数方法返回的基础,即:

public interface IRepository<T> {
    void Add(T source);
    T Find(int id);
}

这将由实际的存储库类继承,如下所示:

public class TestClientRepository : IRepository<ClientEmailAddress>, IRepository<ClientAccount> {
}

这个想法是,在一个ClientRepository中,例如,我想对几个不同的对象类型(ClientAccount, ClientEmailAddress等)执行操作;但基本上,所需的操作类型都是相同的。

当我尝试使用TestClientRepository(在显式实现接口之后)时,我看不到多个Find和Add方法。

有人能帮忙吗?谢谢。

c#接口具有相同的方法名

当然-你所要做的就是使用作为适当的接口:

TestClientRepository repo = new TestClientRepository();
IRepository<ClientEmailAddress> addrRepo = repo;
ClientEmailAddress address = addrRepo.Find(10);
IRepository<ClientAccount> accountRepo = repo;
ClientAccount accoutn = accountRepo.Find(5);

基本上显式实现的接口方法只能在接口类型的表达式上调用,而不能在实现接口的具体类型上调用。

你说:

(在显式实现接口之后)

当显式实现接口时,"看到"这些方法的唯一方法是将对象强制转换为显式实现的类型。因此,如果您想将其用作IRepository<ClientEmailAddress>,则必须将转换为。使用它作为TestClientRepository不会让您看到任何显式实现的方法。

由于继承接口中的泛型参数不同,因此而不是实际上需要Add的显式接口实现。

不幸的是,通用参数不影响Find的签名,但您可以仍然选择两个Find中的一个作为"默认"。例如:

interface IRepository<T> {
    void Add(T source);
    T Find(int id);
}
class ClientEmailAddress {
}
class ClientAccount {
}
class TestClientRepository : IRepository<ClientEmailAddress>, IRepository<ClientAccount> {
    public void Add(ClientEmailAddress source) {
        throw new NotImplementedException();
    }
    public void Add(ClientAccount source) {
        throw new NotImplementedException();
    }
    public ClientAccount Find(int id) {
        throw new NotImplementedException();
    }
    ClientEmailAddress IRepository<ClientEmailAddress>.Find(int id) {
        throw new NotImplementedException();
    }
}
// ...
var x = new TestClientRepository();
x.Find(0); // Calls IRepository<ClientAccount>.Find.
((IRepository<ClientAccount>)x).Find(0); // Same as above.
((IRepository<ClientEmailAddress>)x).Find(0); // Calls IRepository<ClientEmailAddress>.Find.

当我显式实现其中一个接口的接口时,我不能使用var关键字

var tcr = new TestClientRepository();
tcr.  -- nothing there.

当我指定类型时,它按预期工作。

IRepository<ClientAccount> ca = new TestClientRepository();
ca.Add(new ClientAccount { AccountName = "test2" });
IRepository<ClientEmailAddress> cea = new TestClientRepository();
cea.Add(new ClientEmailAddress { Email = "test2@test.com" });
相关文章: