所以情况是,我有几个类,它们都有一个标准的CRUD方法,但是是静态的。我希望创建一个将被继承的基类,以便它能够强制实现这个CRUD方法。但问题是,CRUD方法是静态的。因此,我无法使用静态创建虚拟方法(原因很明显)。不管怎么说,我可以在不影响静态的情况下实现这一点。
此外,这些CRUD方法的签名也是类似的。
例如,ClassA将拥有具有这些类型签名的CRUD方法。
ClassB将有CRUD签名,如
因此,我希望创建一个具有完全类似签名的基类,这样继承的派生方法将实现它们自己的版本。
例如,BaseClass将有CRUD方法,如
但问题是,我不能使用虚拟和静态,因为它的可变逻辑,这将失败,没有任何意义。
有什么出路吗?
此外,我想在基类中声明的公共变量(常量)很少,这样就不需要在每个派生类上声明它们。这就是为什么我也不能使用界面。
有什么能用抽象类完成的吗?
发布于 2014-11-17 22:49:44
这样的方法不应该是static (如果您必须处理两个数据库呢?)它们也不应该出现在你的实体类中。
相反,您应该有一个单独的类型,表示该实体的存储。该类型可能是通用的,因此不需要重复不特定于实体的代码。
这样,继承就可以工作( ClassA的存储可以从一些基本存储继承),并且您不必执行荒谬的“我必须创建一个人来获得所有人员的列表”。
例如,实体框架使用这种模式,存储类型称为DbSet。
发布于 2014-11-18 09:33:15
你走错路了。任何时候,如果你想拥有一组类似的相关方法,并且它们看起来应该是静态的,请考虑所有这一切都意味着你试图把它们放在错误的位置。在这种情况下,您似乎正在使用表数据网关模式。只需将这些方法作为虚拟方法移到单独的类中,拥有每个此类类的一个共享实例,以及一个抽象的泛型超类,以确保实现是一致的。
发布于 2018-11-26 13:07:14
处理这一问题的另一种方法是,基类接受如下所示的依赖项:
public abstract class MyBaseClass<T> : where T : object {
protected IMyDataRepository _repository;
public MyBaseClass(IMyDataRepository repository){
_repository = repository;
}
public abstract bool TryInsert(T item);
// so you can implement explicit persistence on the derived classes
}然后,您可以使用存储库来处理状态和持久性更改,同时静态地将其从类中解耦。如果程序需要,您可以实现直接从DbSet<T>继承的某种程度的分离。
https://softwareengineering.stackexchange.com/questions/262997
复制相似问题