我有一堂课。
此类应具有内容属性。当前内容的类型为:Row
(List<IRowContent>
是接口)
其他类IRowContent
和Column
,TextContent
实现接口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/