我有一个基类:
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";
}
换句话说,所有免费图块都具有相同的纹理,并且所有墙面砖都具有相同的纹理 - 这就是为什么在我看来我应该使用静态。
如何正确地做到这一点?
答案 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
字段texture
和texture_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
引用包含texture
和texture_path
属性,以便您可以从实例访问共享的texture
或texture_path
,则需要virtual
或abstract
属性。
例如:
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