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

时间:2014-04-04 15:13:35

标签: c# design-patterns builder factory-pattern

我正在尝试将创建模式应用于以下业务域。我不确定它是否是正确的解决方案,但我一直在查看工厂和构建器模式,但我可能会尝试应用错误的模式。以下是以下域名:

  • 技术规格
    • 视觉规格
      • 视野(字符串)
      • Resolution(String)
    • 音频规格
      • 频率范围(字符串)
      • 麦克风(布尔)

所以上面我有一个技术规范的业务对象,我只是展示了两个例子,但它们最多可以是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();            
        }
    }

Abstract Tech Spec Builder:

public abstract class TechnicalSpecificationBuilder
    {

        public Specification CreateSpecification()
        {
            return BuildSpecification();
        }

        protected abstract Specification BuildSpecification();       
    }

Visual Tech Spec Builder:

 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; }       
    }

1 个答案:

答案 0 :(得分:1)

以下应该做的 - 使用构建器类的通用基类,并使具体的规范子类成为类型参数。

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