我之前没有看到作为类成员实现的接口。有人可以解释发生了什么吗?你被允许实例化一个接口吗?这些接口所需方法的实现在哪里?
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; }
}
答案 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);
我之前没有看到作为类成员实现的接口。有人可以解释发生了什么吗?
我上面用一个例子解释了什么。
这实际上是一种非常常见的方式,是的还有其他方法,但这是其中一种方式。
<强>优点强>
这样你的MyClass
不知道将传递哪种具体类型,但它知道具体类型是什么,它将支持接口。
在MyClass
内,您将只拥有依赖于界面的代码,因此您的课程松散耦合。
依赖注入可用于将依赖项注入MyClass
的构造函数。这称为构造函数注入。
与我通常使用接口的方式相比有什么不同:
没有区别。但是你需要考虑人们如何使用这门课程。例如,如果您想使用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。
通过类构造函数,您可以为MyClass
,ITest1
和ITest2
注入实例。这些实例应该是一些实现适当接口的类。
示例:强>
您可以实现接口并提供如下示例中的对象:
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);
,test1
和test2
实现了接口test3
,ITest1
和ITest2
。
<强>结论强>:
没有魔力。 接口被替换为其继承类型的类型!基本上,您在代码中提供抽象实现。