Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#从静态方法调用抽象方法_C#_Static_Virtual_Abstract - Fatal编程技术网

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

C#从静态方法调用抽象方法,c#,static,virtual,abstract,C#,Static,Virtual,Abstract,我正在编写一个库,它可以用于不同的数据库引擎。抽象类具有抽象DbParameter构造函数,并使用System.Data.Common中的类 现在我有了sutch结构: public abstract class ASqlWorker{ abstract protected DbParameter DbParameterConstructor(String paramName, Object paramValue); } 现在,我可以从ASqlWorker的静态方法调用abstractD

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

现在我有了sutch结构:

public abstract class ASqlWorker{

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

}
现在,我可以从ASqlWorker的静态方法调用abstractDbParameterConstructor

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


我只想编写一些从DbParameter到新DbParameter[1]的隐式转换器,以具有更灵活的接口。

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

这是可能的:

ASqlWorker a = new SubClassesASqlWorker();  //<-- assume you extending ASqlWorker and implemented it
ASqlWorker a = new ASqlWorker();
您可以使用抽象类型的参数定义静态方法,但只能传递完全实现的对象和抽象类的子类。

我做到了

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

我做了什么:

  • 创建了抽象类AbstractDbParameterConstructors,它不包含任何状态,只包含抽象方法
  • 类ASqlWorker现在从AbstractDbParameterConstructors中继承得到泛型

    public abstract partial class ASqlWorker<TPC>
                where TPC : AbstractDbParameterConstructors, new()
    { ... }
    
在这里,我有一些类似抽象静态方法的东西,我受到保护,不受不良影响,不受标准创造者试图保护我的巫婆的影响


details:

您需要一个实例来调用非静态方法。如果没有对类实例的引用,则无法从静态方法调用实例方法。您希望在此处使用哪个派生类实现?您的整个前提是,
ASQLWorker
不知道如何实现该方法,并且可能存在许多不同的设想。你想用哪一个?你说得对。重点是在ASqlWorker静态方法中创建,该方法生成DbConnection和DbParameter。然后在ASqlWorker的非静态方法中使用这些方法来实现一些普通逻辑。ASqlWorker的继承者只实现生成器,我得到了可移植库。
private static TPC generator = new TPC();