是否有用于访问 IEnumerable 中具体类型的设计模式
本文关键字:类型 设计模式 IFoo 用于 访问 IEnumerable 是否 | 更新日期: 2023-09-27 17:56:33
我正在尝试将创建模式应用于以下业务域。我不确定这是否是正确的解决方案,但我一直在查看工厂和制造商模式,但我可能试图应用错误的模式。以下是以下域:
- 技术规格
- 视觉规格
- 视野(字符串)
- 分辨率(字符串)
- 音频规格
- 频率范围(串)
- 麦克风(布尔值)
- 视觉规格
所以上面我有一个技术规范的业务对象,我只是展示了两个的例子,但它们最多可以有 N 个对象。这适用于技术规范的属性,每个规范最多可以有 N 个属性。
如果我想返回技术规范的属性,我遇到了障碍,试图使用上述模式以抽象的方式对其进行编码。我被迫投掷它们,关于适用于这种情况的模式的任何建议?
这是我正在尝试执行的一些代码示例,请参见下文。在 main 函数中,我可以构建我的规范对象,但如果我想在不强制转换的情况下访问规范对象的具体属性。我希望这能澄清一些事情。
主要功能:
class Program
{
static void Main(string[] args)
{
TechnicalSpecificationBuilder visual = new VisualSpecificationBuilder();
TechnicalSpecificationBuilder audio = new AuditorySpecificationBuilder();
//TODO, how do I get acces to properties without Casting?
Specification visualSpec = visual.CreateSpecification();
Specification audiotSpec = audio.CreateSpecification();
}
}
抽象技术规范生成器:
public abstract class TechnicalSpecificationBuilder
{
public Specification CreateSpecification()
{
return BuildSpecification();
}
protected abstract Specification BuildSpecification();
}
视觉技术规范生成器:
public class VisualSpecificationBuilder : TechnicalSpecificationBuilder
{
protected override Specification BuildSpecification()
{
// TODO: Implement this method
return new VisualSpecification();
}
}
摘要规范:
public abstract class Specification
{
}
视觉规格:
public class VisualSpecification : Specification
{
public string FieldOfView { get; set; }
public bool IsBinocularVisionCapable { get; set; }
public bool IsHeadTrackingCapable { get; set; }
public bool IsEyeTrackingCapable { get; set; }
public string Resolution { get; set; }
}
下面应该可以解决问题 - 对构建器类使用泛型基类,并使具体规范子类成为类型参数。
public abstract class TechnicalSpecificationBuilder<TSpecification>
where TSpecification : Specification
{
public TSpecification CreateSpecification()
{
return this.BuildSpecification();
}
protected abstract TSpecification BuildSpecification();
}
public class VisualSpecificationBuilder : TechnicalSpecificationBuilder<VisualSpecification>
{
protected override VisualSpecification BuildSpecification()
{
return new VisualSpecification();
}
}
我还建议考虑使用接口ISpecification
代替或与基类Specification
一起使用 - 如果您达到由于任何原因无法从基类派生具体规范类的地步,这可能会有所帮助。