[英]Use Non-Generic Base Class Collection for Derived Class?
好吧,很難用語言來解釋它。 所以這是一個例子。 在SDL .NET API中,有一個名為SpriteCollection
的類,該類旨在……是sprite的集合。 但是問題是由於某種原因,開發人員決定不使SpriteCollection
通用,例如.NET List<>
類。 因此,我猜想,它只能與Sprite
類或從Sprite
繼承的其他類一起使用? 不管怎么說,我是從Sprite
派生Tile
。 然后向其中添加兩個新屬性:
class Tile : Sprite
{
public Tile(char symbol = default(char), bool solid = true)
{
Symbol = symbol;
Solid = solid;
}
public char Symbol
{
get;
set;
}
public bool Solid
{
get;
set;
}
}
現在,如何將SpriteCollection
與Tile
一起使用,並且仍然能夠使用諸如Solid
類的Tile
專有屬性?
一種(可能是愚蠢的)解決方案可能是這樣的:
Tile t = (Tile) myCollection[i];
if (t.Solid) { ... }
有沒有更好的辦法來做這樣的事情?
您建議將SpriteCollection
的返回值SpriteCollection
為Tile
是這樣做的方法。 如果您需要使用提供的集合類並且無法更改它,則沒有更好的選擇。
如果要避免在迭代過程中進行強制轉換,則可以重寫GetEnumerator方法。
public class TileList: SpriteList {
public new IEnumerator<Tile> GetEnumerator()
{
foreach (var tile in GetBase())
{
if (tile is Tile)
{
yield return tile as Tile;
}
}
}
protected SpriteList GetBase()
{
return (SpriteList )this;
}
}
(這確實進行了強制轉換,但是將其強制轉換封裝在枚舉器中。)
現在,如何將SpriteCollection與Tiles結合使用,並且仍然能夠使用Solid等Tile專有屬性?
您可以通過某種形式的轉換來實現。 您的方法有效,盡管我個人會使用:
Tile t = myCollection[i] as Tile;
if (t != null)
{
if (t.Solid) { ... }
}
這使您可以將Tile
實例以及其他精靈安全地添加到集合中。
如果使用通用類,如List<Sprite>
,則會出現相同的問題。 這將允許您使用任何Sprite
子類,而不僅僅是Tile
。 為了不進行強制類型轉換而具有類型安全的集合,您必須使用List<Tile>
,這將限制您只能在集合中使用圖塊,而不能限制其他精靈。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.