繁体   English   中英

如何强制子类实现静态方法

[英]How to force sub class to implement a static method

我知道这只能通过一种解决方法来实现 但为什么?

我想为我的应用程序添加插件支持。 所以我设计了一个抽象类,所有未来的插件都需要实现。 每个插件都必须实现一个GetVersion()方法,如本示例代码所示:

public abstract class Plugin
{
    public abstract int GetVersion();
}

public class MyPlugin : Plugin
{
    public override int GetVersion()
    {
        return 1;
    }
}

只要我在调用GetVersion()方法之前实例化插件,这当然可以完美运行。

但是如果我想创建它的实例之前获取插件的版本号? 例如检查兼容性?

public class Program
{
    public Program()
    {
        if (MyPlugin.GetVersion() > 1)
        {
            PluginLoader.Load(new MyPlugin());
        }
    }
}

虽然它可能不会直接回答您的问题“为什么”,但我认为以下解决方案可能对您的场景有用:

使用程序集版本属性

  Assembly thisAssem = typeof(MyPlugin).Assembly;
  AssemblyName thisAssemName = thisAssem.GetName();

  Version ver = thisAssemName.Version;

它永远不能由 C# 完成,因为不能在派生类中实现静态方法。

与解决方法一样,您可以创建一个静态工厂来创建实例。

public abstract class Plugin
{
    public abstract int GetVersion();
}

public class FactoryPlugin<T> where T : Plugin, new()
{
    public static int GetVersion()
    {
        return new T().GetVersion();
    }
}

public class Program
{
    public Program()
    {
        if (FactoryPlugin<MyPlugin>.GetVersion() > 1)
        {

        }
    }
}

考虑以类似于 COM 类工厂的方式使用工厂模式。 您创建了两个类,您的有用类和一个类工厂类。 您的类工厂类实现了 IPluginFactory。 你用你的插件打包它。 插件工厂有各种简单的方法,但其中之一允许创建您的插件。 它与@ThierryV 显示的很接近,但没有静态方法。 所以过程是:

  • 使用您计划用来存储和实例化插件的任何东西,但不是实例化插件,而是实例化适当的插件工厂
  • 你可以让插件工厂做任何你想做的事情——获取关于插件的详细信息,允许实例化最新版本或特定版本的插件——去镇上
  • 但是,最终,您使用工厂的实例来实例化您的插件。

这是一个很好的起点: 什么是类工厂? ,但是 Don Box 的 Essential COM 书是我很久以前在遥远的地方学到所有这些东西的地方。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM