我有数字- TriangleItem和CircleItem:
public abstract class BaseItem
{
protected int _id;
protected string _description;
}
public sealed class TriangleItem : BaseItem
{
public int TriangleId { get { return _id; } set { _id = value; } }
public string TriangleDescription { get { return _description; } set { _description = value; } }
}
public sealed class CircleItem : BaseItem
{
public int CircleId { get { return _id; } set { _id = value; } }
public string CircleDescription { get { return _description; } set { _description = value; } }
}我有数字收藏,TriangleBox和CircleBox:
public abstract class BaseBox
{
public string ItemsXml { get; set; }
public string Descriptions { get; set; }
public static abstract BaseBox Boxing( BaseItem[] items );
public abstract void Unboxing();
}
public sealed class TriangleBox : BaseBox
{
public static override BaseBox Boxing( BaseItem[] items )
{
string[] ids = items.ToList().Cast<TriangleItem>().Select( i => i.TriangleId.ToString() ).ToArray();
string[] descriptions = items.ToList().Cast<TriangleItem>().Select( i => i.TriangleDescription ).ToArray();
return new TriangleBox()
{
ItemsXml = Util.ToXml( ids ),
Descriptions = descriptions.Aggregate( ( d, next ) => next + ", " + d )
};
}
public TriangleItem[] Unboxing()
{
return Util.FromXml( ItemsXml ).Select( i => new TriangleItem { TriangleId = int.Parse( i ), TriangleDescription = i } ).ToArray();
}
}
public sealed class CircleBox : BaseBox
{
public static override BaseBox Boxing( BaseItem[] items )
{
string[] ids = items.ToList().Cast<CircleItem>().Select( i => i.CircleId.ToString() ).ToArray();
string[] descriptions = items.ToList().Cast<CircleItem>().Select( i => i.CircleDescription ).ToArray();
return new CircleBox()
{
ItemsXml = Util.ToXml( ids ),
Descriptions = descriptions.Aggregate( ( d, next ) => next + ", " + d )
};
}
public CircleItem[] Unboxing()
{
return Util.FromXml( ItemsXml ).Select( i => new CircleItem { CircleId = int.Parse( i ), CircleDescription = i } ).ToArray();
}
}正如您所看到的,我有几乎相同的方法实现--装箱和取消装箱。我使用这些方法如下:
public BaseBox Do( BaseItem[] items )
{
BaseBox result = null;
if( items is CircleItem[] )
result = CircleBox.Boxing( items );
else if( items is TriangleItem[] )
result = TriangleBox.Boxing( items );
return result;
}
public TriangleItem[] GetTriangles()
{
TriangleBox tb = DB.GetTriangleBox(); // From database
return tb.Unboxing();
}
public CircleItem[] GetCircles()
{
CircleBox cb = DB.GetCircleBox(); // From database
return cb.Unboxing();
}我可以长乐一些东西,只有一个拳击和取消装箱的实现?您会在这段代码中更改什么?您不喜欢什么(除了捕获空方法的参数)?如果需要的话,AOP和Generics都可以。
在做的方法中我必须知道项目的类型。如果TriangleBox为0,则必须返回空的items.Length或CircleBox。我要怎么用这个案子写我的方法?
发布于 2013-08-22 11:22:01
我想你真的需要区分圆圈和三角。任何方式都可以使用基类的自动属性。
public abstract class BaseItem
{
public int Id { get; set; }
public string Description { get; set; }
}
public sealed class TriangleItem : BaseItem
{
// Another TriangleItem class members
}
public sealed class CircleItem : BaseItem
{
// Another CircleItem class members
}封装mehtod返回的对象类型不同,这是BaseBox的子类型。这意味着您可以合并它们并将特定的框创建委托给子类。
public abstract class BaseBox
{
public string ItemsXml { get; set; }
public string Descriptions { get; set; }
public BaseBox Boxing(BaseItem[] items)
{
var ids = items.ToList().Select(i => i.Id.ToString()).ToArray();
var descriptions = items.ToList().Select(i => i.Description.ToString()).ToArray();
var box = CreateBox(Util.ToXml(ids), descriptions.Aggregate((d, next) => next + ", " + d));
return box;
}
public BaseItem[] Unboxing()
{
return Util.FromXml(ItemsXml).Select(i => CreateItem(int.Parse(i), i)).ToArray();
}
protected abstract BaseBox CreateBox(string itemsXml, string descriptions);
protected abstract BaseItem CreateItem(int id, string description);
}对于取消装箱和BaseItem,也可以这样做。
public sealed class TriangleBox : BaseBox
{
protected override BaseBox CreateBox(string itemsXml, string descriptions)
{
return new TriangleBox { ItemsXml = itemsXml, Descriptions = descriptions };
}
protected override BaseItem CreateItem(int id, string description)
{
return new TriangleItem { Id = id, Description = description };
}
}
public sealed class CircleBox : BaseBox
{
protected override BaseBox CreateBox(string itemsXml, string descriptions)
{
return new CircleBox { ItemsXml = itemsXml, Descriptions = descriptions };
}
protected override BaseItem CreateItem(int id, string description)
{
return new CircleItem { Id = id, Description = description };
}
}更新:装箱方法应该无效。很有可能改名为“DoBoxing”。
public abstract class BaseBox
{
...
public void Boxing(BaseItem[] items)
{
var ids = items.ToList().Select(i => i.Id.ToString()).ToArray();
var descriptions = items.ToList().Select(i => i.Description.ToString()).ToArray();
this.ItemsXml = Util.ToXml(ids);
this.Descriptions = descriptions.Aggregate((d, next) => next + ", " + d);
}
...
}并称为:
public BaseBox Do(BaseItem[] items)
{
...
if (result != null)
{
result.Boxing(items);
}
return result;
}https://codereview.stackexchange.com/questions/30067
复制相似问题