是否有用于访问 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; }       
    }

是否有用于访问 IEnumerable<IFoo> 中具体类型的设计模式

下面应该可以解决问题 - 对构建器类使用泛型基类,并使具体规范子类成为类型参数。

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一起使用 - 如果您达到由于任何原因无法从基类派生具体规范类的地步,这可能会有所帮助。