我有一个应用程序,我想用插件功能扩展。我遵循这种方法:
Creating a simple plugin mechanism
我的应用程序有一个类Table和一个静态类TableManager,它管理(添加,获取)表对象。 TableManager应该保持静态类。为了使插件编写者能够访问所有当前的表对象,我想放置' TableManager'和'表'在一个自己的DLL。我不能简单地将表的整个实现放到dll中,因为Table中有很多相关的代码。所以我在dll中创建了一个Table接口,我的应用程序中的类Table实现了这个接口。
'表' MainApplication中的类:
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; }
}
现在的问题是我无法在TableManager中创建新的ITable对象,就像我之前使用Table对象一样,因为我无法创建新的接口实例。我怎么能解决这个问题?
答案 0 :(得分:2)
正如评论中提到的Corak一样,如果您需要以某种方式在Table
内创建TableManager
个对象,则需要某人谁知道Table
并了解如何构建它。换句话说,您需要一个可以通过ITable
接口创建表示给客户端的对象的工厂。
如何到达它并不重要 - 可以是单独的工厂对象,也可以是ITable
界面中的工厂方法。
以下是工厂对象的示例:
public class TableFactory : ITableFactory
{
public ITable NewTable(string name)
{
return new Table(name);
}
}
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 */
}
查看实时样本at Rextester
答案 1 :(得分:1)
正如我在评论中所述,您无法创建界面实例。您需要创建一个实现该接口的类。 请考虑以下代码。
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);
}
}
我希望这可以帮助您解决问题。
答案 2 :(得分:0)
您需要在类
中继承接口 public class Table : ITable
和他们inicialise表类不是ITable接口。您无法启动界面。