Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 工厂返回接口_C#_Design Patterns_Interface - Fatal编程技术网

C# 工厂返回接口

C# 工厂返回接口,c#,design-patterns,interface,C#,Design Patterns,Interface,我正在创建一个票务系统,其中一个请求由用户提交,最终由SME响应。在这个系统中可以提出两种类型的请求;支持硬件查询和备用驱动程序查询 由于它们具有相似的特性,我创建了一个名为IRequest的接口 public interface IRequest { int RequestId { get; } State State { get; } RequestHeader RequestHeader { get; } InterimDialogue InterimDia

我正在创建一个票务系统,其中一个请求由用户提交,最终由SME响应。在这个系统中可以提出两种类型的请求;支持硬件查询和备用驱动程序查询

由于它们具有相似的特性,我创建了一个名为IRequest的接口

public interface IRequest
{
    int RequestId { get; }
    State State { get; }
    RequestHeader RequestHeader { get; }
    InterimDialogue InterimDialogue { get; }       
    RequestSolution RequestSolution { get; }
}
在两种请求类型略有不同的地方,我创建了两个单独的接口,它们都实现了IRequest

SupportHardwarequiry的接口如下所示

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 ...
}
为了实例化SupportHardwareRequesty对象,使用了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);
}
但是现在我知道我需要提前知道,我想得到什么,剩下的似乎没有多大意义


我知道我可以使用继承来代替,但是当我有时想将这些设计情况视为一般请求,有时又想将其视为特定类型的请求时,我应该如何处理这些设计情况呢?

如果CreateSupportHardwarequiry()总是会返回IsupperWarequiry,只需在方法定义中键入Hint即可

public class RequestFactory : IRequestFactory
{
    public ISupportHardwareEnquiry CreateSupportHardwareEnquiry()
    {
        return new SupportHardwareEnquiry();
    }


    public IRequest CreateAlternateDriverEnquiry()
    {
        return new AlternateDriverEnquiry();
    }
}
public class RequestFactory : IRequestFactory
{
    public ISupportHardwareEnquiry CreateSupportHardwareEnquiry()
    {
        return new SupportHardwareEnquiry();
    }


    public IRequest CreateAlternateDriverEnquiry()
    {
        return new AlternateDriverEnquiry();
    }
}