C#从静态方法调用抽象方法

时间:2014-11-25 17:19:45

标签: c# static virtual abstract

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

现在我有sutch结构:

public abstract class ASqlWorker{

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

}

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

Logicaly,我可以使abstractMethod静态(它从名称和值创建DbParameter的继承者的实例,并且不使用ASqlWorker的字段),但在C#中不允许这样做。 顺便说一下,不允许因为使用非实现静态方法会造成麻烦。但在我的情况下,它不会,因为我的抽象方法受到保护。

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

2 个答案:

答案 0 :(得分:0)

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

这是可能的:

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

这是不可能的:

ASqlWorker a = new ASqlWorker();

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

答案 1 :(得分:0)

我做到了!

lol,我在C#中实现了抽象静态方法!

我做了什么:

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

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

    private static TPC generator = new TPC();
    

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

deatails:http://sourceforge.net/projects/sqlworker/