实例化 class 但声明为接口
Instantiating the class but declared as an interface
假设我有这个界面和存储库
接口:
interface ICustomerRepository
{
实现接口的仓库
public class CustomerRepository:ICustomerRepository
{
在控制器中,我声明了一个接口实例,
private ICustomerRepository repository = null;
谁能解释一下这行的概念?
this.repository = new CustomerRepository();
还在学习中,需要输入。
谁能帮帮我?
在该特定情况下,由于 repository
是 ICustomerRepository
的占位符,这意味着您将只能访问 ICustomerRepository
.
中的所有可用成员
考虑以下因素:
interface ICustomerRepository
{
void MethodB();
然后你用这个成员实现它:
public class CustomerRepository:ICustomerRepository
{
public void MethodA(){...} //Exclusive to CustomerRepository
public void MethodB(){...} //CustomerRepository implements interface
当您使用 this.repository
时,只有界面中可用的成员可用,例如:
this.repository.MethodB() //this is legal
但不是
this.repository.MethodA() //this is illegal
因为 MethodA
是 CustomerRepository
的一部分。
所以你必须考虑是否要隔离你想访问的成员。它只是来自 interface
本身的成员组吗?或者您还想访问 CustomerRepository
的 class 内的其他成员,在某些情况下,这些成员可能还实现多个接口,例如:
CustomerRepository: ICustomerRepository, ICustomerRepository2, ICustomerRepository3
等等。
所以为了缩短下面的行只允许您访问在 CustomerRepository
中实现的成员,这些成员在 ICustomerRepository
.
的合同中达成一致
//Get only members defined inside `ICustomerRepository`
//This can be properties or methods
this.repository = new CustomerRepository();
要验证您在评论中提出的问题,请参阅以下内容:
ICustomerRepository repository = new CustomerRepository();
//Yields true repository is instance of ICustomerRepository
Console.WriteLine(typeof(ICustomerRepository).IsInstanceOfType(repository));
//Yields true repository is instance of CustomerRepository
Console.WriteLine(typeof(CustomerRepository).IsInstanceOfType(repository));
CustomerRepository repository2 = new CustomerRepository();
//Yields true repository2 is instance of ICustomerRepository
Console.WriteLine(typeof(ICustomerRepository).IsInstanceOfType(repository2));
//Yields true repository2 is instance of CustomerRepository
Console.WriteLine(typeof(CustomerRepository).IsInstanceOfType(repository2));
All 产生 true,因此您会看到 repository
的实例是 ICustomerRepository
和 CustomerRepository
类型的实例。
假设我有这个界面和存储库
接口:
interface ICustomerRepository
{
实现接口的仓库
public class CustomerRepository:ICustomerRepository
{
在控制器中,我声明了一个接口实例,
private ICustomerRepository repository = null;
谁能解释一下这行的概念?
this.repository = new CustomerRepository();
还在学习中,需要输入。 谁能帮帮我?
在该特定情况下,由于 repository
是 ICustomerRepository
的占位符,这意味着您将只能访问 ICustomerRepository
.
考虑以下因素:
interface ICustomerRepository
{
void MethodB();
然后你用这个成员实现它:
public class CustomerRepository:ICustomerRepository
{
public void MethodA(){...} //Exclusive to CustomerRepository
public void MethodB(){...} //CustomerRepository implements interface
当您使用 this.repository
时,只有界面中可用的成员可用,例如:
this.repository.MethodB() //this is legal
但不是
this.repository.MethodA() //this is illegal
因为 MethodA
是 CustomerRepository
的一部分。
所以你必须考虑是否要隔离你想访问的成员。它只是来自 interface
本身的成员组吗?或者您还想访问 CustomerRepository
的 class 内的其他成员,在某些情况下,这些成员可能还实现多个接口,例如:
CustomerRepository: ICustomerRepository, ICustomerRepository2, ICustomerRepository3
等等。
所以为了缩短下面的行只允许您访问在 CustomerRepository
中实现的成员,这些成员在 ICustomerRepository
.
//Get only members defined inside `ICustomerRepository`
//This can be properties or methods
this.repository = new CustomerRepository();
要验证您在评论中提出的问题,请参阅以下内容:
ICustomerRepository repository = new CustomerRepository();
//Yields true repository is instance of ICustomerRepository
Console.WriteLine(typeof(ICustomerRepository).IsInstanceOfType(repository));
//Yields true repository is instance of CustomerRepository
Console.WriteLine(typeof(CustomerRepository).IsInstanceOfType(repository));
CustomerRepository repository2 = new CustomerRepository();
//Yields true repository2 is instance of ICustomerRepository
Console.WriteLine(typeof(ICustomerRepository).IsInstanceOfType(repository2));
//Yields true repository2 is instance of CustomerRepository
Console.WriteLine(typeof(CustomerRepository).IsInstanceOfType(repository2));
All 产生 true,因此您会看到 repository
的实例是 ICustomerRepository
和 CustomerRepository
类型的实例。