【问题标题】:How to force sub class to implement a static method如何强制子类实现静态方法
【发布时间】:2018-07-13 15:29:19
【问题描述】:

我知道这只能通过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());
        }
    }
}

【问题讨论】:

  • 在创建实例时继承是有意义的。换句话说,它适用于 Objects 而不是类。即使有可能,也不会毫无收获。例如,如果您需要使用静态方法,则需要使用类的名称访问它:ClassName.Do(),如果您被允许继承和覆盖它,那么您将访问它:InheritingClass.Do() 那么到底是什么收获:你还是写了类名和方法名。
  • 你是如何获得版本的?

标签: c# oop plugins architecture


【解决方案1】:

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

使用assembly version attribute:

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

  Version ver = thisAssemName.Version;

【讨论】:

  • 这实际上解决了我的问题。我认为“为什么”的最佳答案来自问题 cmets 中的@CodingYoshi:“创建实例时继承是有意义的”
【解决方案2】:

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)
        {

        }
    }
}

【讨论】:

  • 这似乎更复杂。如果你强制 Plugin 实现 GetVersion() 方法,那么工厂上的静态方法似乎没有必要,因为他们可以在工厂创建它之后只需 plugin.GetVersion()。 OP 特别想要实例化之前的版本,但是您的静态 GetVersion() 方法正在创建对象。
【解决方案3】:

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

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

这是一个很好的起点:What exactly is a Class Factory?,但我很久以前在很远的地方学到了所有这些东西。

【讨论】:

    猜你喜欢
    • 2012-11-14
    • 2013-08-02
    • 2011-03-25
    • 2010-12-18
    • 2010-12-26
    • 2015-10-27
    • 2019-07-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多