Как интерфейсы способствуют повторному использованию кода? - PullRequest
0 голосов
/ 14 февраля 2012

Простой вопрос для интервью. Как интерфейсы помогают с повторным использованием кода?

Ответы [ 3 ]

2 голосов
/ 14 февраля 2012

interface s позволяет вам отделить реализацию от информации, которая заботит вызывающий класс. Это позволяет вам отстранить ваши классы от знания интимных классов, от которых оно зависит.

Учитывая следующее 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 голос
/ 14 февраля 2012

Интерфейс отделяет потребителя от деталей реализации класса. Это помогает включить возможность многократного использования, поскольку класс, реализующий интерфейс, может измениться без необходимости изменения кода, потребляющего реализацию.

Это очень запутанно, может быть, пример помогает

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 веб-фреймворку. Это действительно вопрос, не зависящий от языка / платформы / фреймворка. Ответ один и тот же, независимо от языка, который вы выбираете для реализации.

0 голосов
/ 14 февраля 2012

Это принцип Открытия и Закрытия, один из важных законов Принципов С.О.Л.И.Д.

его идею легко изменить с минимальными изменениями в существующем коде. И в конечном итоге помогает с модульным тестированием.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...