0

我有一个基类:

class Tile{}

很少有其他延伸瓷砖的

class Free : Tile{}
class Wall : Tile{}

每个图块都有自己的纹理,它不是字符串,而是必须在初始化时加载的 Texture2D。我想代码看起来与此类似,但我不确定如何正确创建它:

class Tile{
    static Texture2D texture; //Static will use less ram because it will be same for inherited class?
    static string texture_path; //This is set by inherited class
    public Tile(){
        if(texture==null)
            texture = LoadTexture(texture_path);
    }
}

class Free : Tile{
    static string texture_path = "Content/wall.png";
}

换句话说,所有免费瓷砖都有相同的纹理,所有墙瓷砖都有相同的纹理——这就是我认为我应该使用静态的原因。

如何正确执行此操作?

4

3 回答 3

0

如果您希望您的基类能够访问 texture_path,您应该在您的基类中声明它。

基类对其子类中声明的字段、属性或方法一无所知。顺便说一句,这是设计使然...

于 2012-11-03T14:09:39.497 回答
0

您需要做的是在基类中声明该属性并为子类提供覆盖它的选项。如果您愿意,这将允许您还提供默认值。

像这样的一些事情:

public class Tile
{
    private string _texturePath = String.Empty;
    private Texture2D _texture;
    protected virtual string TexturePath { private get { return _texturePath; } set { _texturePath = value; } }

    public Tile()
    {
        if (!string.IsNullOrWhiteSpace(TexturePath))
            _texture = LoadTexture(TexturePath);
    }
    private Texture2D LoadTexture(string texturePath)
    {
        throw new NotImplementedException();
    }
}

internal class Texture2D
{
}

public sealed class Free:Tile
{
    protected override string TexturePath
    {
        set
        {
            if (value == null) throw new ArgumentNullException("value");
            base.TexturePath = "Content/wall.png";
        }
    }
}

如果您不想提供默认纹理路径,则可以计划使属性和基类抽象。

于 2012-11-03T14:38:16.490 回答
0

根据您的问题,您希望所有实例Free共享纹理,所有实例Wall共享纹理。这意味着您希望这些static字段位于子类中,texturetexture_path不是父类中。

前任:

public class Tile { }

public class Free : Tile
{
    private static Texture2D texture;
    private static string texture_path;
}

public class Wall : Tile
{
    private static Texture2D texture;
    private static string texture_path;
}

如果您希望Tile引用具有texturetexture_path属性,以便您可以从实例访问共享的texture或,您需要一个或属性。texture_pathvirtualabstract

前任:

public abstract class Tile
{
    public abstract Texture2D Texture { get; }
    public abstract string TexturePath { get; }
}

public class Free : Tile
{
   private static Texture2D texture;
   private static string texture_path;

   public override Texture2D Texture { get { return texture; } }
   public override string TexturePath { get { return texture_path; } }
}

// and similarly for Wall
于 2012-11-04T05:47:38.613 回答