C# - 在静态类中创建新的'interface-represented-classes'对象



我有一个应用程序,我想用插件功能进行扩展。我遵循这种方法:

创建一个简单的插件机制

我的应用程序有一个类表和一个静态类表管理器,它管理(添加,获取(表对象。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 接口。您无法启动接口。

最新更新