我有一堂课。
此类应具有内容属性。当前内容的类型为:Row

List<IRowContent>是接口)

其他类IRowContentColumnTextContent实现接口ImageContent

我现在可以将一些列添加到列表或真实的“内容”(文本或图像)中。

但是您也可以添加列和文本/图像。但是,如果一行包含文本/图像,则不应包含其他项目。

我如何设计我的班级结构来支持这一点?

编辑:一些其他信息:
我想使用“流畅的界面” http://en.wikipedia.org/wiki/Fluent_interface构建布局

我的想法是防止VisualStudio的智能感知错误使用。

这是我的课程:
布局具有一个列列表。

class Layout
   {
      //Attributes
      public Color Background { get; set; }
      public List<Column> Columns { get; set; }
      public uint Margin { get; set; }

      public Layout AddColumn(Column c)
      {
         return null;
      }

      public Layout SetColumnList(List<Column> c)
      {
         return null;
      }
   }


该列具有内容列表(IColumnContent)。该列本身来自IRowContent。

class Column : IRowContent
   {
      public List<IColumnContent> Content { get; private set; }

      public Column AddToContent(IColumnContent obj)
      {
         return null;
      }

      public Column SetContent(List<IColumnContent> objs)
      {
         return null;
      }
   }


与具有IRowContent的行相同:

   class Row : IColumnContent
   {
      public List<IRowContent> Content { get; private set; }

      //...
   }


ImageContent和TextContent实现两个接口:

class TextContent : IRowContent, IColumnContent

class ImageContent : IRowContent, IColumnContent

最佳答案

如果声明接口

interface IRowContent
{
    bool SupportsOtherChildren{ get; }
    ...
}

class ImageContent : IRowContent
{
    public bool SupportsOtherChildren
    {
        get { return false; }
    }
}

class Column : IRowContent
{
    public bool SupportsOtherChildren
    {
        get { return true; }
    }
}


您可以重写集合的insert和remove方法来支持此行为:

 class RowContentCollection : Collection<IRowContent>
    {
        bool containsSingleItem = false;
        protected override void InsertItem(int index, IRowContent item)
        {
            if (containsSingleItem)
                throw new InvalidOperationException("Collection contains an item that doesnt allow other items.");

            containsSingleItem = !item.SupportsOtherChildren;

            base.InsertItem(index, item);
        }

        protected override void RemoveItem(int index)
        {
            if (!this[index].SupportsOtherChildren)
                containsSingleItem = false;

            base.RemoveItem(index);
        }
    }

关于c# - C#-复杂变量分配,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6694151/

10-11 18:33