为什么这个接口在这个类中实现?

时间:2017-03-08 01:02:41

标签: c# interface

我之前没有看到作为类成员实现的接口。有人可以解释发生了什么吗?你被允许实例化一个接口吗?这些接口所需方法的实现在哪里?

public class MyClass
{
    private readonly ITest1 interface1;
    private readonly ITest2 interface2;
    private readonly ITest3 interface3;

    public MyClass(ITest1 interface1, ITest2 interface2, ITest3 interface3)
    {
        this.interface1 = interface1;
        this.interface2 = interface2;
        this.interface3 = interface3;
    }

    public void TestMethod()
    {
        var lines = interface1.GetData();
        var file = interface2.Parse(lines);
        interface3.Copy(file);
    }
}

与我通常使用接口的方式相比有什么不同:

public class Person : IEquatable<Dog>
{
    public int Age { get; set; }

    public bool Equals(Dog d)
    {
        if (d.Age == this.Age)
            return true;
        else
            return false;
    }
}

public class Dog
{
    public int Age { get; set; }
}

3 个答案:

答案 0 :(得分:3)

区别在于:

您对Person课程所做的是界面实施

MyClass没有实现任何接口,但它接受接口作为构造函数参数。调用构造函数的人将提供实现接口的实例。更多内容如下。

  

您是否可以实例化界面?

NO。实现接口的类将被实例化。

  

这些接口所需方法的实现在哪里?

当人创建类的实例时,它们将传递实现接口的类的实例。像这样:

public interface ITest1
{
    string GetData();
}
public class Test1 : ITest1
{
    public string GetData()
    {
        return "Data";
    }
}

他们会这样打电话给你的班级:

var test1 = new Test11();

// instead of nulls it will be other instances like test1
var myClass = new MyClass(test1, null, null);
  

我之前没有看到作为类成员实现的接口。有人可以解释发生了什么吗?

我上面用一个例子解释了什么。

这实际上是一种非常常见的方式,是的还有其他方法,但这是其中一种方式。

<强>优点

  1. 这样你的MyClass不知道将传递哪种具体类型,但它知道具体类型是什么,它将支持接口。

  2. MyClass内,您将只拥有依赖于界面的代码,因此您的课程松散耦合。

  3. 依赖注入可用于将依赖项注入MyClass的构造函数。这称为构造函数注入。

  4.   

    与我通常使用接口的方式相比有什么不同:

    没有区别。但是你需要考虑人们如何使用这门课程。例如,如果您想使用MyClass,您将执行此操作,这正是您习惯的:

    public class Test1 : ITest1
    {
        public string GetData()
        {
            return "Data";
        }
    }
    

    为了进一步澄清,想象MyClass有另一个构造函数和字段,如下所示:

    private readonly IEquatable<Dog> iEq;
    public MyClass(IEquatable<Dog> iEq) { this.iEq = iEq; }
    

    然后你会用你的Person类的实例来调用它。所以它没有任何不同。

    注意:没有人会因为等同于狗而感到高兴;)

答案 1 :(得分:1)

您无法实例化接口;派生类将传递给构造函数。

所以你会有一些课程:

pip install pystan

并使用它们:

class A : ITest1 {  }
class B : ITest2 {  }
class C : ITest3 {  }

答案 2 :(得分:1)

你无法实例化界面,你可以用他继承的类型替换界面!

这是接口的常规用法(您的示例):

VC-CV

您已在类public class MyClass { public MyClass(ITest1 interface1, ITest2 interface2, ITest3 interface3) { this.interface1 = interface1; this.interface2 = interface2; this.interface3 = interface3; } public void TestMethod() { var lines = interface1.GetData(); var file = interface2.Parse(lines); interface3.Copy(file); } private readonly ITest1 interface1; private readonly ITest2 interface2; private readonly ITest3 interface3; } 中创建了三个字段:interface1,interface2和interface3。

通过类构造函数,您可以为MyClassITest1ITest2注入实例。这些实例应该是一些实现适当接口的类。

示例:

您可以实现接口并提供如下示例中的对象:

ITest3

创建public class Test1 : ITest1 { public string GetData() { // code } } public class Test2 : ITest2 { public string GetData() { // code } } public class Test3 : ITest3 { public string GetData() { // code } } 的示例将是:

MyClass

对象var test1 = new Test1(); var test2 = new Test2(); var test3 = new Test3(); var myClass = new MyClass(test1, test2, test2); test1test2实现了接口test3ITest1ITest2

<强>结论

没有魔力。 接口被替换为其继承类型的类型!基本上,您在代码中提供抽象实现。