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

时间:2018-07-13 15:29:19

标签: c# oop plugins architecture

我知道只有workaround才有可能。但是为什么呢?

我想为我的应用添加插件支持。因此,我设计了一个抽象类,所有将来的插件都需要实现。每个插件都必须实现一个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());
        }
    }
}

3 个答案:

答案 0 :(得分:1)

尽管它可能无法直接回答您的问题“为什么”,但我认为以下解决方案可能对您的情况有用:

使用assembly version attribute

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

  Version ver = thisAssemName.Version;

答案 1 :(得分:0)

由于无法在派生类中实现静态方法,因此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)
        {

        }
    }
}

答案 2 :(得分:0)

考虑以类似于COM类工厂的方式使用Factory模式。您创建两个类,您的有用的类和一个类工厂类。您的类工厂类实现IPluginFactory。您将其与插件打包在一起。插件工厂有多种简单方法,但是其中一种方法可以创建您的插件。它与@ThierryV显示的内容很接近,但是没有静态方法。这样的过程是:

  • 使用计划用于存储和实例化插件的任何方法,但是要实例化适当的Plugin Factory,而不是实例化插件
  • 您可以让Plugin工厂做您想做的一切-获取有关插件的详细信息,允许实例化插件的最新版本或特定版本-前往城镇
  • 但是,最终,您将使用工厂实例来实例化您的插件。

这是一个不错的起点:What exactly is a Class Factory?,但是很久以前,在Don Box的Essential COM书籍中,我学到了所有这些东西。