【问题标题】:Factory Returns Interface工厂退货接口
【发布时间】: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


    【解决方案1】:

    如果 CreateSupportHardwareEnquiry() 总是返回 ISupportHardwareEnquiry,只需在方法定义中输入提示即可。

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

    【讨论】:

      猜你喜欢
      • 2020-12-25
      • 2017-04-10
      • 1970-01-01
      • 2014-03-21
      • 1970-01-01
      • 1970-01-01
      • 2012-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多