我有一个应用程序,我想用插件功能进行扩展。我遵循这种方法:
创建一个简单的插件机制
我的应用程序有一个类表和一个静态类表管理器,它管理(添加,获取(表对象。TableManager 应该保持静态类。为了使插件编写者能够访问所有当前的表对象,我想将"TableManager"和"Table"放在自己的dll中。我不能简单地将 Table 的整个实现放到 dll 中,因为 Table 中有很多依赖代码。所以我在 dll 中创建了一个 Table 接口,我的应用程序中的 Table 类实现了这个接口。
主应用程序中的"表"类:
public class Table : ITable
{
private string _name;
public Table (string newName)
{
_name = newName;
}
// Here is much more code
}
.dll:
public static class TableManager
{
private static Dictionary<string, ITable> _tableDict = new Dictionary<string, ITable>();
public static Dictionary<string, ITable> getDict
{
get { return _tableDict; }
}
public static void addTable(string name)
{
// This is the line where the fault occurs:
_tableDict[name] = new ITable(name);
}
}
public interface ITable
{
string name { get; set; }
}
现在的问题是,我无法像现在使用Table对象那样在TableManager中创建新的ITable对象,因为我无法创建接口的新实例。我该如何解决这个问题?
正如 Corak 在他的评论中提到的那样,如果您需要以某种方式在TableManager
中创建Table
对象,您需要了解Table
并知道如何构建它的人。换句话说,您需要一个工厂,该工厂可以通过ITable
接口创建表示给客户端的对象。
如何到达它并不重要 - 它可以是一个单独的工厂对象,也可以是接口ITable
工厂方法。
下面是一个包含工厂对象的示例:
除主要应用外:
public class TableFactory : ITableFactory
{
public ITable NewTable(string name)
{
return new Table(name);
}
}
添加到 dll:
public interface ITableFactory
{
ITable NewTable(string name);
}
public class TableManager
{
private ITableFactory factory;
public TableManager(ITableFactory factory)
{
this.factory = factory;
}
public void addTable(string name)
{
_tableDict[name] = factory.NewTable(name);
}
/* the rest of your code */
}
在Rextester查看实时样本
正如我在评论中所说,您无法创建接口实例。您需要创建一个实现接口的类。 请考虑以下代码。
public interface ITable
{
string Name { get; set; }
}
public class Table : ITable
{
public Table(string name)
{
this.Name = name;
}
public string Name {get;set;}
}
public static class TableManager
{
private static Dictionary<string, ITable> _tableDict = new Dictionary<string, ITable>();
public static Dictionary<string, ITable> getDict
{
get { return _tableDict; }
}
public static void addTable(string name)
{
_tableDict[name] = new Table(name);
}
}
我希望这能帮助您解决问题。
你需要继承类中的接口
public class Table : ITable
并且它们初始化表类而不是 IT 接口。您无法启动接口。