2

嗯,很难用语言来解释。所以这里有一个例子。在 SDL .NET API 中,有一个名为的类SpriteCollection,它被设计为……嗯……精灵的集合。然而问题在于,出于某种原因,开发人员决定不制作SpriteCollection通用类,如 .NETList<>类。所以,我想,它只能与Sprite继承自的类或其他类一起使用Sprite?无论如何,假设我Tile来自Sprite. 我向它添加了两个新属性:

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;
    }
}

现在,我怎样才能使用SpriteCollectionwith Tiles 并且仍然能够使用Tile独占属性Solid

一个(可能是愚蠢的)解决方案可能是这样的:

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

有没有更好的方法来做这样的事情?

4

3 回答 3

3

您提出的将返回值转换为SpriteCollectiontoTile的建议就是这样做的方法。如果您需要使用提供的集合类并且无法更改它,那么您没有更好的选择。

于 2012-07-31T20:14:27.553 回答
1

如果您想在迭代时避免强制转换,您可以覆盖 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;
    }
}

(这当然会强制转换,但它会将强制转换封装在枚举器中。)

于 2012-07-31T20:19:34.060 回答
0

现在,我怎样才能将 SpriteCollection 与 Tiles 一起使用,并且仍然能够使用像 Solid 这样的 Tile 专有属性?

你可以通过某种形式的演员来做到这一点。您的方法有效,尽管我个人会使用:

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

这使您可以Tile安全地将实例以及其他精灵添加到集合中。

如果您使用泛型类,例如List<Sprite>. 这将允许您使用任何子Sprite类,而不仅仅是Tile. 为了在不进行强制转换的情况下获得类型安全的集合,您必须使用List<Tile>,这将限制您在集合中仅使用图块,而不是其他精灵。

于 2012-07-31T20:12:50.533 回答