Я начинаю видеть значение интерфейсов vs. позволяет говорить абстрактным классом.Справка Создание интерфейса
В настоящее время я работаю над проектом PayPal Wrapper. Вероятно, мы также будем делать обложку Google Payments, BillMeLater и Amazon. Мне было предложено определить некоторые общие черты (методы, свойства и т. Д.), Которые мы могли бы использовать по всем направлениям, в большинстве проектов веб-службы SOAP Wsdl Wrapper для любых веб-сервисов, которые мы делаем.
Так как я кодирование моих оберток PayPal, я создал новый класс для хранения ошибок получили обратно от какого-либо ответа PayPal:
public class ApiError
{
#region Constructors
/// <summary>
/// Disallow default instantiation.
/// </summary>
private ApiError()
{
}
internal ApiError(ErrorType error)
{
if(error.ErrorCode != null)
{
this._errorCode = error.ErrorCode;
}
}
#endregion
#region member variables
private string _errorCode = string.Empty;
private string _erorMessage = string.Empty;
#endregion
#region Properties
public string ErrorCode
{
get { return _errorCode; }
set { _errorCode = value; }
}
public string ErrorMessage
{
get { return _errorMessage; }
set { _errorMessage = value; }
}
#endregion
}
Во всяком случае, я сказал, эй, эти ErrorMessage и ERRORCODE свойство, скорее всего, собирается быть в каждом стороннем API. Так почему бы не создать интерфейс в новом проекте под названием [MyCompany] .WebServices.Common и в этом интерфейсе добавить эти 2 свойства. Тогда любая оболочка класса, которую я создаю, которая имеет функциональность для создания запросов API-прокси, может реализовать этот интерфейс, и тогда я знаю, что любой из этих классов оболочек в любом из наших проектов веб-сервисов будет гарантированно иметь такие свойства в них, которые будут быть уничтожены и заполнены любыми ошибками, которые возвращаются из ответа API.
И если это так, то это здорово, потому что я могу начать создавать вспомогательные методы, которые мы можем использовать по всем направлениям, если я могу как-то взять общий объект ответа и заполнить массив ошибок и установить свойство.
В любом случае, моя проблема в том, что я новичок в интерфейсах litte. Таким образом, свойство массива ошибок сверху, например, имеет собственный тип.
Ну, если я создаю интерфейс в отдельном физическом проекте, я не могу использовать этот настраиваемый тип, потому что он не существует ... он существует только в моем проекте-оболочке PayPal.
Так что, если вы заглушите этот интерфейс, как бы я справился с этим?
namespace [MyCompany].WebServices.Common
{
interface IRequest
{
public ApiError Type { get; set; } //whoops, that's a custom type that this project does not know about (ApiError)
}
}
Я не понимаю. Итак, как IApiError знает о моем конкретном типе ApiError? – PositiveGuy
Это наоборот. Конкретный класс ApiError реализует IApiError. Какой бы класс, который реализует IRequest, не знает, какие объекты APIError он должен возвращать и делает это. –
А я вижу. Поэтому у меня будет класс ApiResponse в любом проекте, реализующем IRequest. Поскольку он реализовал IRequest, он также должен реализовать IApiError, и поэтому класс ApiResponse должен иметь любые свойства в IApiError? – PositiveGuy