首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >力派生类实现静态方法C#

力派生类实现静态方法C#
EN

Software Engineering用户
提问于 2014-11-17 06:34:26
回答 4查看 8.5K关注 0票数 2

所以情况是,我有几个类,它们都有一个标准的CRUD方法,但是是静态的。我希望创建一个将被继承的基类,以便它能够强制实现这个CRUD方法。但问题是,CRUD方法是静态的。因此,我无法使用静态创建虚拟方法(原因很明显)。不管怎么说,我可以在不影响静态的情况下实现这一点。

此外,这些CRUD方法的签名也是类似的。

例如,ClassA将拥有具有这些类型签名的CRUD方法。

  1. 公共静态List Get()
  2. 公共静态ClassA Get(int )
  3. 公共静态bool插入(ClassA objA)
  4. 公共静态bool更新(Int)
  5. 公共静态bool删除(Int ID)

ClassB将有CRUD签名,如

  1. 公共静态List Get()
  2. 公共静态ClassB Get(int )
  3. 公共静态bool插入(ClassB objB)
  4. 公共静态bool更新(Int)
  5. 公共静态bool删除(Int ID)

因此,我希望创建一个具有完全类似签名的基类,这样继承的派生方法将实现它们自己的版本。

例如,BaseClass将有CRUD方法,如

  1. 公共虚拟静态List Get()
  2. 公共虚拟静态BaseClassGet(int )
  3. 公共虚拟静态bool插入(BaseClass objBase)
  4. 公共虚拟静态bool更新(Int)
  5. 公共虚拟静态bool删除(Int)

但问题是,我不能使用虚拟和静态,因为它的可变逻辑,这将失败,没有任何意义。

有什么出路吗?

此外,我想在基类中声明的公共变量(常量)很少,这样就不需要在每个派生类上声明它们。这就是为什么我也不能使用界面。

有什么能用抽象类完成的吗?

EN

回答 4

Software Engineering用户

回答已采纳

发布于 2014-11-17 22:49:44

这样的方法不应该是static (如果您必须处理两个数据库呢?)它们也不应该出现在你的实体类中。

相反,您应该有一个单独的类型,表示该实体的存储。该类型可能是通用的,因此不需要重复不特定于实体的代码。

这样,继承就可以工作( ClassA的存储可以从一些基本存储继承),并且您不必执行荒谬的“我必须创建一个人来获得所有人员的列表”。

例如,实体框架使用这种模式,存储类型称为DbSet

票数 17
EN

Software Engineering用户

发布于 2014-11-18 09:33:15

你走错路了。任何时候,如果你想拥有一组类似的相关方法,并且它们看起来应该是静态的,请考虑所有这一切都意味着你试图把它们放在错误的位置。在这种情况下,您似乎正在使用表数据网关模式。只需将这些方法作为虚拟方法移到单独的类中,拥有每个此类类的一个共享实例,以及一个抽象的泛型超类,以确保实现是一致的。

票数 3
EN

Software Engineering用户

发布于 2018-11-26 13:07:14

处理这一问题的另一种方法是,基类接受如下所示的依赖项:

代码语言:javascript
复制
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://www.martinfowler.com/eaaCatalog/repository.html

票数 2
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/262997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档