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

时间:2017-07-21 07:30:30

标签: c# dll plugins interface

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

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对象一样,因为我无法创建新的接口实例。我怎么能解决这个问题?

3 个答案:

答案 0 :(得分:2)

正如评论中提到的Corak一样,如果您需要以某种方式Table内创建TableManager个对象,则需要某人谁知道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 */
}

查看实时样本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接口。您无法启动界面。