Я бы сказал, что это зависит.Большую часть времени вы не хотите работать с конкретными типами, такими как ваш FtpWebRequest
, так как это делает вас связанными с этим типом.Если вы вместо этого работаете с интерфейсом, называемым IRequest
или IWebRequest
, вы не будете так привязаны к конкретной реализации этого интерфейса, что означает, что большую часть времени вам будет проще тестировать ваш код, и у вас будет меньшеболь при переходе с ftp на какой-то другой протокол, если он соответствует используемому вами интерфейсу.Но если вы делаете что-то действительно простое, вам может не понадобиться добавлять дополнительные уровни абстракции, которые создают интерфейсы.
Простой пример:
public interface IDoSomething { void DoSomething(); }
public class DoSomethingA { public void DoSomething(); }
public interface DoSomethingB { public void DoSomething(); }
public class UseDoSomething
{
public UseDoSomething(IDoSomething do) { do.DoSomething(); }
}
Если вы в классе UseDoSomething
взял в одном из конкретных типов;DoSomethingA
или DoSomethingB
, у вас будет более тесная связь с этой реализацией.В приведенном мною примере вы можете использовать любую реализацию IDoSomething
в качестве входных данных для UseDoSomething
, что отлично подходит для будущего, а также облегчает тестирование.Как вы понимаете, все зависит от ваших требований и т. Д. Может быть, вы должны использовать конкретный тип, так как вам нужен доступ к этой конкретной вещи типа, тогда это может быть хорошо.
Я проясню?