【发布时间】:2020-03-14 16:49:12
【问题描述】:
我目前的结构是这样的:
public class CustomerRepository
{
// ..
public virtual Customer LoadCustomer()
{
// ...
}
}
public class OracleCustomerRepository : CustomerRepository
{
private OracleConnection oracleConnection;
public OracleCustomerRepository()
: base(){
if(this.EnsureIsConnected()){
// ...
}
}
private bool EnsureIsConnected(){
// ..
}
public override Customer LoadCustomer(){
// ..
}
}
效果很好,除了 - 对于每个 OracleRepository - 我必须再次编写方法 EnsureIsConnected,我必须再次声明归档的 OracleConnection 等等。
我想抽象一下。我的第一个想法是使用Interface,但这并不能解决重复代码的问题。我的第二个想法是使用基类CustomerRepository 作为另一个新基类OracleRepository<T> 的泛型类型,然后定义通用例程。
问题是:据我所知,override 无法使用泛型类型的 virtual 方法,例如 CustomerRepository。
这就是我认为它会起作用的方式。
public class OracleRepository<T> where T : class{
public OracleRepository(){
this.EnsureIsConnected());
}
protected OracleConnection oracleConnection;
protected EnsureIsConnected(){
// ...
}
}
public class OracleCustomerRepository : OracleRepository<CustomerRepository>{
// ..
// this is not possible, defined in CustomerRepository
public override Customer LostCustomer(){
}
}
注意:CustomerRepository 不是我拥有的唯一存储库。这主要是我试图找到更好的解决方案的原因。
关于如何解决这个问题的任何建议?
【问题讨论】:
-
"据我所知,没有办法覆盖泛型类型的虚方法" - 你能提供一个你认为不可能的例子吗?
-
可能写得不够清楚,但无论如何,如果你在基类中有虚方法,你可以覆盖它。通用虚拟方法可以像任何其他虚拟方法一样被覆盖
-
@MichaelKokorin 虚拟方法是在泛型类型中定义的,而不是在基类中。我会用一个例子来更新帖子。
-
“我想抽象 OracleConnection 的东西。”听起来您几乎可以在这里使用策略模式。您是否打算让
CustomerRepository为不同的 DB 类型使用不同的连接类型? -
@MongZhu 每个不同的数据库类型都是
CustomerRepository的新实现。
标签: c# .net generics inheritance interface