我认为向集合中添加某些内容的最常见方法是使用Add
集合提供的某种方法:
class Item {}
var items = new List<Item>();
items.Add(new Item());
实际上,这没有什么不寻常的。
我不知道为什么我们不这样做:
var item = new Item();
item.AddTo(items);
它似乎比第一种方法更自然。当Item
类具有类似Parent
以下属性时,将具有andvantange :
class Item
{
public object Parent { get; private set; }
}
您可以将二传手设为私人。在这种情况下,您当然不能使用扩展方法。
但是也许我错了,我以前从未见过这种模式,因为它是如此罕见?你知道有没有这种模式?
在C#
扩展方法中将对此有用
public static T AddTo(this T item, IList<T> list)
{
list.Add(item);
return item;
}
其他语言呢?我猜大多数情况下,Item
该类必须提供一个名为“ ICollectionItem
接口”的接口。
更新1
我一直在考虑这一点,例如,如果您不希望将某个项目添加到多个集合中,那么这种模式将非常有用。
测试ICollectable
界面:
interface ICollectable<T>
{
// Gets a value indicating whether the item can be in multiple collections.
bool CanBeInMultipleCollections { get; }
// Gets a list of item's owners.
List<ICollection<T>> Owners { get; }
// Adds the item to a collection.
ICollectable<T> AddTo(ICollection<T> collection);
// Removes the item from a collection.
ICollectable<T> RemoveFrom(ICollection<T> collection);
// Checks if the item is in a collection.
bool IsIn(ICollection<T> collection);
}
和示例实现:
class NodeList : List<NodeList>, ICollectable<NodeList>
{
#region ICollectable implementation.
List<ICollection<NodeList>> owners = new List<ICollection<NodeList>>();
public bool CanBeInMultipleCollections
{
get { return false; }
}
public ICollectable<NodeList> AddTo(ICollection<NodeList> collection)
{
if (IsIn(collection))
{
throw new InvalidOperationException("Item already added.");
}
if (!CanBeInMultipleCollections)
{
bool isInAnotherCollection = owners.Count > 0;
if (isInAnotherCollection)
{
throw new InvalidOperationException("Item is already in another collection.");
}
}
collection.Add(this);
owners.Add(collection);
return this;
}
public ICollectable<NodeList> RemoveFrom(ICollection<NodeList> collection)
{
owners.Remove(collection);
collection.Remove(this);
return this;
}
public List<ICollection<NodeList>> Owners
{
get { return owners; }
}
public bool IsIn(ICollection<NodeList> collection)
{
return collection.Contains(this);
}
#endregion
}
用法:
var rootNodeList1 = new NodeList();
var rootNodeList2 = new NodeList();
var subNodeList4 = new NodeList().AddTo(rootNodeList1);
// Let's move it to the other root node:
subNodeList4.RemoveFrom(rootNodeList1).AddTo(rootNodeList2);
// Let's try to add it to the first root node again...
// and it will throw an exception because it can be in only one collection at the same time.
subNodeList4.AddTo(rootNodeList1);
add(item, collection)
,但这不是好的OO风格。
item.AddTo(items)
假设您有一门没有扩展方法的语言:无论是否自然,要支持addTo,每种类型都需要此方法,并为支持追加的每种类型的集合提供该方法。这就像在我所听到的所有内容之间引入依赖关系的最佳示例:P-我认为这里的错误前提是试图对“现实”生活中的某些编程抽象进行建模。这经常出错。