gpt4 book ai didi

c# - 工厂返回界面

转载 作者:太空宇宙 更新时间:2023-11-03 16:01:14 25 4
gpt4 key购买 nike

我正在创建一个票务系统,用户提交请求并最终由 SME 回复。在此系统中可以提出两种类型的请求; SupportHardwareEnquiry 和 AlternateDriverEnquiry。

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

public interface IRequest
{
int RequestId { get; }
State State { get; }
RequestHeader RequestHeader { get; }
InterimDialogue InterimDialogue { get; }
RequestSolution RequestSolution { get; }
}

这两种请求类型略有不同,我创建了两个单独的接口(interface),它们都实现了 IRequest。

SupportHardwareEnquiry 接口(interface)如下

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;

但现在看来我需要提前知道我想要得到什么,剩下的似乎没有多大意义。

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

最佳答案

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

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


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

关于c# - 工厂返回界面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21281025/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com