[英]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.