簡體   English   中英

使用非通用基類集合作為派生類?

[英]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;
    }
}

現在,如何將SpriteCollectionTile一起使用,並且仍然能夠使用諸如Solid類的Tile專有屬性?

一種(可能是愚蠢的)解決方案可能是這樣的:

Tile t = (Tile) myCollection[i];
if (t.Solid) { ... }

有沒有更好的辦法來做這樣的事情?

您建議將SpriteCollection的返回值SpriteCollectionTile是這樣做的方法。 如果您需要使用提供的集合類並且無法更改它,則沒有更好的選擇。

如果要避免在迭代過程中進行強制轉換,則可以重寫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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM