我知道在.Net中接口定义了一个接口与继承它的类之间的契约。最近我刚刚完成了一个大量使用接口作为数据访问层的项目,这让我想到……这有什么大不了的呢?当我需要添加一个新方法到DAL时,我必须在接口中创建方法签名,并将其添加到继承接口的类以及DAL中,从而增加了"额外的工作"。那么接口有什么大不了的,而且为什么我要为自己创造额外的工作呢?
List<T>
的性能差劲的代码。如果你使用List<T>
的硬实现,很可能会通过改变实现来破坏更多的代码。IList<T>
或者IEnumerable<T>
,你可以将List<T>
替换为LinkedList<T>
(或任何实现你选择的接口的类型)并在一个地方解决问题,而不是必须触及所有的代码。在我看来,接口与类不同的重要之处在于,接口不像类那样被绑定到特定的继承层次结构中,因此它们比类更加灵活,可用于实现抽象接口。使用接口而不是具体类使得系统耦合度更低。更改实现很容易:只需提供任何其他实现所需接口的类即可。
使用接口的一个原因是可以在类之间创建松散的耦合。
例如,如果你在类构造函数中传递一个接口而不是实际的类,你将允许更松散的耦合。因为任何人都可以继承该接口并实现自己的实现。
foreach (object obj in myArray)
{
// distroy all IDisposable objects
if (obj is IDisposable)
(obj as IDisposable).Dispose();
// ends initialization of all ISupportInitialize objects
else if (obj is ISupportInitialize)
(obj as ISupportInitialize).EndInit();
}
因此,如果一些不同的对象实现了相同的接口,那么该接口保证每个对象都有一些共同的方法,这些方法在接口中描述。
这在对象集合中非常有用。您知道所有的动物(包括人类)都可以吃东西。因此,如果您在汽车上有动物,它们每个人都可以吃,无论是人、老鼠还是斑马...
所以接口IEatable :)...
在我上学的时候,我并没有理解接口或者迭代器的美妙之处,因为我们尝试解决的问题可以不使用抽象化方法就用一半的代码量完成。
总的来说,软件模式是由行业真正需要而产生的。我想接口在某个时候被认为几乎是一种模式。
由于时间限制,学校项目所能教授的知识是有限的。
通过使用接口,我可以使我的代码更具可测试性。
如果我有一个ManagerClass
public class PersonManager
{
public PersonManager(IPersonRepository repository)
{
this.Repository = repository;
}
private IPersonRepository Repository{get;set;}
public Person ChangeUsername(string username)
{
Person person = this.Repository.GetByUsername(username);
person.Username = username;
this.Repository.Save(person);
return person;
}
}
public class MockPersonRepository : IPersonRepository
{
public Person GetByUsername(string username)
{
return new Person();
}
public void Save()
{}
}
当我编写单元测试时,我可以传入模拟对象:
[Test]
public void ChangeUserName_NewUsername_ExpectUpdateUsername()
{
//Arrange
var manager = new PersonManager(new MockPersonManager());
//Act
Person person = manager.ChangeUsername("bob");
//Assert
Assert(AreEqual("bob", person.Username);
}
我现在已经测试过,我的ChangeUsername方法已经更新了用户名,同时没有与数据库通信
List<T>
)不同,您可以设计为针对接口(IList<T>
)工作,并能够使用实现该接口的任何对象进行工作。