一个简单的面试问题。 接口如何帮助代码重用?
答案 0 :(得分:2)
interface
允许您将实现与调用类关心的信息分开。这使您可以使您的课程与亲密所依赖的课程知识分离。
鉴于以下interface
:
public interface IRepository<T> {
void Save(T entity);
void Update(T entity);
void Delete(T entity);
}
可以针对所述接口对依赖类进行编程,并从细节中“屏蔽”。
public class SomeService {
private IRepository<Contact> _contactRepo;
public SomeService(IRepository<Contact> contactRepo){
_contactRepo = contactRepo;
}
}
利用此模式,您可以创建所述接口的不同实现:
public class LinqToSqlRepository<Contact> : IRepository<Contact>
{ /* ... */ }
public class EntityFrameworkRepository<Contact> : IRepository<Contact>
{ /* ... */ }
public class NHibernateRepository<Contact> : IRepository<Contact>
{ /* ... */ }
答案 1 :(得分:1)
接口将使用者与类的实现细节分离。这有助于实现可重用性,因为实现接口的类可以更改,而无需更改消耗实现的代码。
这非常令人困惑,可能是一个例子帮助
public interface IUserAuthentication
{
public bool Authenticate(string name, string password);
}
现在我将编写消费者,它不关心如何执行身份验证,它只是知道它可以验证用户。
public class Consumer
{
private IUserAutentication _auth;
public Consumer(IUserAuthentication auth)
{
_auth = auth;
}
public void Working(string username, string password)
{
if (!_auth.Authenticate(username, password))
{
throw new Exception("error!");
}
}
}
无论IUserAuthentication服务的实现如何,上述代码都将起作用。这是重用代码的一种方法。
现在我可以实现IUserAuthentication接口
public class AuthenticateJasons : IUserAuthentication
{
public bool Authenticate(string username, string password)
{
return username == "Jason";
}
}
public class AuthenticateNoone: IUserAuthentication
{
public bool Authenticate(string username, string password)
{
return false;
}
}
关键是,就消费者而言,这些实施是无关紧要的。此外,这个问题与ASP.NET框架无关。这实际上是一个语言/平台/框架无关的问题。无论您选择使用哪种语言,答案都是一样的。
答案 2 :(得分:0)
这是开放式和封闭式原则,是S.O.L.I.D原则的重要法律之一。
它的想法很容易改变,只需对现有代码进行最小的更改。最终有助于单元测试。