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方法。
有人能帮忙吗?谢谢。
当然-你所要做的就是使用作为适当的接口:
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" });