访问接口方法而不引用类

时间:2013-01-24 09:59:48

标签: c# class interface

假设我在名为“Interface”的项目中有这样的界面:

public interface TestInterface
{
    string Operation();
}

和实现它的类。该类位于另一个项目“Class”中:

public class TestClass : TestInterface
{
    public TestClass() { }

    public string Operation()
    {
        return "This is an Operation";
    }
}

我的客户做了类似这样的事情(又在另一个项目“客户”中):

class Program
{
    static void Main(string[] args)
    {
        TestInterface i = new TestClass();
        i.Operation();
    }
}

我的问题与这一行有关:

TestInterface i = new TestClass();

通过添加这一行,我实际上不得不在我的“客户端”项目中添加对“Interface”和“Class”项目的引用。所以为什么这么大惊小怪呢?如果不保持“接口”之间我不能直接引用“类”吗?有没有办法只通过接口访问方法(没有引用实现类)?我在这里错过了什么吗?

5 个答案:

答案 0 :(得分:2)

  

有没有办法通过仅接口访问方法

是的,有。您可以使用TestClass动态加载程序集而不引用它,通过Activator.CreateInstance创建其实例并将其转换为接口类型:

var assembly = Assembly.Load(...);
var typeFromAssembly = assembly.GetTypes()...;
var myInterfaceVar = (TestInterface)Activator.CreateInstance(typeFromAssembly);

......或者......你可以使用现有的DI框架之一(例如MEF)并以更正确的方式做同样的事情:

[Import]
private TestInterface myInterfaceField;

或:

var myInterfaceVar = compositionContainer.GetExportedValue<TestInterface>();

根据您的喜好,您可能会提出更具体的问题。

答案 1 :(得分:0)

使您的代码完全独立于TestInterface使用Dependency Inversion的实现。这可以通过一些依赖注入框架来实现。

E.g。使用Unity,您可以通过xml配置实现

<register type="TestInterface" 
          mapTo="Foo.Bar.TestClass, Foo.Bar" />

您的代码将仅依赖于Unity(不参考实现):

TestInterface i = Container.Resolve<TestInterface>();

答案 2 :(得分:0)

在该特定样本中,没有任何优势。

但想象一下方法:

public void Foo(ITestInterface handler)
{
    handler.Operation();
}

现在,Foo仅在接口上运行,并不关心具体类实现此接口的内容。您现在可以使用FooTestClass的实例来呼叫TestClass2,这可以在不同的程序集中定义。

答案 3 :(得分:0)

您可以通过使用IOC实现您所描述的行为。 Unity是一个依赖注入容器,它允许在不手动创建实例的情况下创建实例。

例如,如果您要将您的类和接口注册为unity,您将直接使用该接口;

TestInterface i = Container.Resolve<TestInterface>();

答案 4 :(得分:0)

您有界面,以便您的应用可以plug in's ..

所以基本上你分享你的界面dll给任何想要为你的应用程序制作插件应用程序的人,然后你可以将新的插件类强制转换到接口并调用它上面的方法..

如果您不将该类强制转换为界面,那么您将如何使插件类适用于您的应用程序..