[英]Factory pattern with interface, how to avoid cast
我尝试使用接口实现工厂模式以创建不同类型的响应,但我不知道我是否做得对。 当我用工厂类调用我的方法SetExceptionResponse
时,我必须SetExceptionResponse
转换它。
界面 :
public interface IResponse
{
int ErrorCode { get; set; }
HeaderResponse HeaderResponse { get; set; }
IResponse SetExceptionResponse(int code, string title, string[] errors);
}
主要班级:
public class Response : IResponse
{
public int ErrorCode { get ; set ; }
public HeaderResponse HeaderResponse { get; set; } = null;
public virtual IResponse SetExceptionResponse(int code, string title, string[] errors)
{
HeaderResponse headerResponse = new HeaderResponse();
if (errors.Length > 0)
{
foreach (string item in errors)
headerResponse.ErrorList.Add(item);
}
headerResponse.Title = title;
headerResponse.StatusCode = code;
return new Response
{
ErrorCode = code,
HeaderResponse = headerResponse
};
}
}
继承主类的其他类:
public class DeleteShipmentResponse : Response
{
public string Value { get; set; }
public override string ToString()
{
return JsonConvert.SerializeObject(this);
}
public override IResponse SetExceptionResponse(int code, string title, string[] errors)
{
HeaderResponse headerResponse = new HeaderResponse();
if (errors.Length > 0)
{
foreach (string item in errors)
headerResponse.ErrorList.Add(item);
}
headerResponse.Title = title;
headerResponse.StatusCode = code;
return new DeleteShipmentResponse
{
ErrorCode = code,
HeaderResponse = headerResponse
};
}
我的工厂类:
public static class ResponseFactory
{
public static IResponse CreateResponse()
{
return new Response();
}
public static IResponse CreateDeleteResponse()
{
return new DeleteShipmentResponse();
}
public static IResponse CreateShipmentResponse()
{
return new ShipmentResponse();
}
public static T CreateResponse<T>()
where T : IResponse
{
return (T)CreateResponse(typeof(T));
}
public static IResponse CreateResponse(Type type)
{
if (type == typeof(Response))
return CreateResponse();
if (type == typeof(DeleteShipmentResponse))
return CreateDeleteResponse();
else if (type == typeof(ShipmentResponse))
return CreateShipmentResponse();
else
throw new ArgumentOutOfRangeException(string.Format(CultureInfo.InvariantCulture, "Unrecognized type [{0}]", type.FullName), "type");
}
}
因此,当我使用工厂创建 DeleteShipmentResponse 并调用 SetExeceptionResponse 时,我会这样做:
DeleteShipmentResponse result = (DeleteShipmentResponse)ResponseFactory.CreateResponse<DeleteShipmentResponse>().SetExceptionResponse(500, "Exception in DeleteShipment()", new string[] { ex.Message });
我必须使用 DeleteShipmentResponse 进行转换,否则会抛出异常。
如何在不对 DeleteShipmentResponse 进行类型转换的情况下获得此信息? 我必须使用通用接口吗?
感谢帮助
如果所有IResponse
都可以使用无参数构造函数,则可以使IResponse
“自身的”泛型,即T
约束为IResponse<T>
:
public interface IResponse<T> where T : IResponse<T>
{
int ErrorCode { get; set; }
HeaderResponse HeaderResponse { get; set; }
T SetExceptionResponse(int code, string title, string[] errors);
}
public class Response<T> : IResponse<T> where T : IResponse<T>, new
{
public int ErrorCode { get; set; }
public HeaderResponse HeaderResponse { get; set; } = null;
public virtual T SetExceptionResponse(int code, string title, string[] errors)
{
HeaderResponse headerResponse = new HeaderResponse();
.....
return new T
{
ErrorCode = code,
HeaderResponse = headerResponse
};
}
}
public class DeleteShipmentResponse : Response<DeleteShipmentResponse>
{
...
public override DeleteShipmentResponse SetExceptionResponse(int code, string title, string[] errors)
{
....
return new DeleteShipmentResponse
{
ErrorCode = code,
HeaderResponse = headerResponse
};
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.