【问题标题】:C# call abstract method from static methodC#从静态方法调用抽象方法
【发布时间】:2014-11-25 17:19:44
【问题描述】:

我正在编写可用于不同数据库引擎的库。抽象类具有抽象 DbParameter 构造函数并使用 System.Data.Common 中的类。

现在我有了 sutch 结构:

public abstract class ASqlWorker{

 abstract protected DbParameter DbParameterConstructor(String paramName, Object paramValue);

}

现在,我可以从 ASqlWorker 的静态方法调用 abstract DbParameterConstructor 吗?

逻辑上,我可以将 abstractMethod 设为静态(它从名称和值创建 DbParameter 继承者的实例,并且不使用 ASqlWorker 的字段),但在 C# 中是不允许的。 顺便说一句,这是不允许的,因为使用未实现的静态方法会导致麻烦。但在我的情况下不会,因为我的抽象方法受到保护。

我只是想写一些从 DbParameter 到 new DbParameter[1] 的隐式转换器,以获得更灵活的接口。

【问题讨论】:

  • 你需要一个实例来调用非静态方法。
  • 如果不引用类的实例,就不能从静态方法调用实例方法。
  • 您希望在这里使用哪个派生类实现?您的整个前提是ASQLWorker 不知道如何实现该方法,并且可能有许多不同的派生。你想用哪一个?

标签: c# static virtual abstract


【解决方案1】:

您的问题假设您可以在抽象“实例”上调用方法,我们都知道这是不可能的,但是如果定义了 subclass 并且您在具体实现的实例上调用抽象定义的方法抽象基类,那么答案是肯定的。但这里的重点是您必须在实例上调用实例方法。

这是可能的:

ASqlWorker a = new SubClassesASqlWorker();  //<-- assume you extending ASqlWorker and implemented it

这是不可能的:

ASqlWorker a = new ASqlWorker();

您可以使用抽象类型的参数定义静态方法,但您只能将完全实现的对象和抽象类的子类传递给它。

【讨论】:

  • 你是对的。重点是在 ASqlWorker 中创建静态方法,生成 DbConnection 和 DbParameter。然后在ASqlWorker的非静态方法中使用这个方法来实现一些普通的逻辑。 ASqlWorker 的继承者只实现了生成器,我得到了可移植的库。
【解决方案2】:

我做到了!

哈哈,我用 C# 实现了抽象静态方法!

我做了什么:

  • 创建了抽象类AbstractDbParameterConstructors,不包含任何状态,只包含抽象方法。
  • ASqlWorker 类现在变得通用,继承自 AbstractDbParameterConstructors。

    public abstract partial class ASqlWorker<TPC>
                where TPC : AbstractDbParameterConstructors, new()
    { ... }
    
  • 声明的私有静态变量

    private static TPC generator = new TPC();
    

在这里我都有抽象静态方法之类的东西,并且我受到保护免受不良影响,标准的女巫创造者试图保护我。

详细信息:http://sourceforge.net/projects/sqlworker/

【讨论】:

    猜你喜欢
    • 2012-12-03
    • 2011-03-19
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多