接口如何促销代码可重用性?

时间:2012-02-14 04:44:57

标签: asp.net .net oop interface

一个简单的面试问题。 接口如何帮助代码重用?

3 个答案:

答案 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原则的重要法律之一。

它的想法很容易改变,只需对现有代码进行最小的更改。最终有助于单元测试。

http://www.oodesign.com/design-principles.html