继承 - 根据子值初始化时更改变量

时间:2012-11-03 13:44:45

标签: c# inheritance xna

我有一个基类:

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

换句话说,所有免费图块都具有相同的纹理,并且所有墙面砖都具有相同的纹理 - 这就是为什么在我看来我应该使用静态。

如何正确地做到这一点?

3 个答案:

答案 0 :(得分:0)

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

基类对其子类中声明的字段,属性或方法一无所知。这是设计BTW ......

答案 1 :(得分: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";
        }
    }
}

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

答案 2 :(得分: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属性,以便您可以从实例访问共享的texturetexture_path,则需要virtualabstract属性。

例如:

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