【发布时间】:2014-01-22 10:59:39
【问题描述】:
我正在创建一个票务系统,其中用户提交请求并最终由 SME 回答。在这个系统中可以提出两种类型的请求; SupportHardwareEnquiry 和 AlternateDriverEnquiry。
由于它们具有相似的特征,我创建了一个名为 IRequest 的接口
public interface IRequest
{
int RequestId { get; }
State State { get; }
RequestHeader RequestHeader { get; }
InterimDialogue InterimDialogue { get; }
RequestSolution RequestSolution { get; }
}
这两种请求类型略有不同,我创建了两个单独的接口,它们都实现了 IRequest。
SupportHardwareEnquiry 接口如下
public interface ISupportHardwareEnquiry : IRequest
{
SupportingInformation SupportingInformation { get; }
ProblemTask ProblemTask { get; }
}
最后具体类实现了ISupportHardwareEnquiry
public class SupportHardwareEnquiry : ISupportHardwareEnquiry
{
public int RequestId { get; private set; }
public State State { get; private set; }
public RequestHeader RequestHeader { get; private set; }
public SupportingInformation SupportingInformation { get; private set; }
public ProblemTask ProblemTask { get; private set; }
public InterimDialogue InterimDialogue { get; private set; }
public RequestSolution RequestSolution { get; private set; }
// etc ...
}
为了实例化 SupportHardwareEnquiry 对象,使用了 RequestFactory
public class RequestFactory : IRequestFactory
{
public IRequest CreateSupportHardwareEnquiry()
{
return new SupportHardwareEnquiry();
}
public IRequest CreateAlternateDriverEnquiry()
{
return new AlternateDriverEnquiry();
}
}
我还使用存储库来列出请求,并重组各个请求。
public interface IRequestRepository
{
IEnumerable<IRequest> GetAllRequests();
IRequest GetAlternateDriverEnquiry(int id);
IRequest GetSupportHardwareEnquiry(int id);
}
虽然我可以使用 GetAllRequests() 方法,因为它仅依赖于 RequestHeader 中的信息,但我遇到的问题是在使用我的 RequestFactory 或 Repository 实例化或重构单个对象时。
由于它们返回 IRequest,因此我无法访问 SupportHardwareEnquiry 的某些属性(即 SupportingInformation 和 ProblemTask)。
我可以转换为具体类型:
IRequest supportHardwareEnquiry = factory.CreateSupportHardwareEnquiry();
var request = (SupportHardwareEnquiry)supportHardwareEnquiry;
但现在看到我需要提前知道什么,我想得到什么,剩下的似乎没有多大意义。
我知道我可以使用继承来代替,但是当我有时想将它们视为一般请求,有时将它们视为特定类型的请求时,我应该如何处理这些设计情况?
【问题讨论】:
标签: c# design-patterns interface