从对象到类获取值

时间:2012-03-04 18:38:56

标签: c# class static xna

public class BlockType
{
     public static BlockType Dirt_Block = new Block("Blah! values here");
}

public  struct Block
{
    public static string Value;

    public Block(string value)
    {
        value = value;
    }
}

有什么办法可以从DirtBlock获得价值吗? BlockType.Dirt_Block.Value Dosent工作,我不确定这是否可行,如果没有任何方法可以获得相同的结果? (更多的值,但我缩短了它的大小)顺便说一下,我从另一个类访问BlockType.Dirt.value。我只希望从中得到一个值

4 个答案:

答案 0 :(得分:2)

那是因为Dirt_BlockBlockType,而不是Block。事实上,我不希望编译这个代码,因为无法将Block转换为BlockType

我不太确定你追求的是什么,但听起来你有一系列适合枚举的块类型:

public enum BlockType
{
   Dirt,
   Wood,
   Metal
}

你有一组块,每个块都有一个块类型:

public class Block
{
   public BlockType Type { get; set; }
}

在这里,我们使用公共汽车财产。您应该避免使用公共字段(没有getter或setter)。

现在,要创建新的Block,您可以使用对象初始化:

var block = new Block { Type = BlockType.Metal };

或者,您可以创建一个带有Block参数的BlockType构造函数。

答案 1 :(得分:1)

实现它的其他方式。

我认为这个方法提供了一种更简单的加载/保存图块地图的方法,并允许在需要时从文本中定义块属性。

对于可能需要优化才能运行良好的游戏,使用虚拟方法和密集继承的严格OOP不是一个好主意。

当然可以通过其他方式改进或完成。 ;)

public struct BlockProperty
{
    public Texture2D Texture;
    public string Name;
}

public class BlockProperties
{
    static readonly List<BlockProperty> Blocks;
    public static readonly BlockProperty Dirt;
    public static readonly BlockProperty Grass;
    public static readonly BlockProperty Wall;

    static BlockProperties( )
    {
        ContentManager Content = Game1.Instance.Content;

        Blocks = new List<BlockProperty>( ) 
        { 
            (Dirt = new BlockProperty( ) { Name = "Dirt", Texture = Content.Load<Texture2D>( "textures/dirt" ) }),
            (Grass = new BlockProperty( ) { Name = "Grass", Texture = Content.Load<Texture2D>( "textures/grass" ) }),
            (Wall = new BlockProperty( ) { Name = "Wall", Texture = Content.Load<Texture2D>( "textures/wall" ) }),
        };
    }

    public static BlockProperty ByName( string name )
    {
        return Blocks.FirstOrDefault( b => b.Name == name );
    }
}


public class Block
{
    public BlockProperty BlockType;
    pulic Vector2 Position;

    public Block( BlockProperty block )
    {
        this.BlockType = block;
    }

     public Block( string block )
    {
        this.BlockType = BlockProperties.ByName(block);
    }
}


public class Game1 : Microsoft.Xna.Framework.Game
{
    GraphicsDeviceManager graphics;

    public static Game1 Instance { get; private set; }

    Block Block;

    public Game1( )
    {
        Instance = this;

        graphics = new GraphicsDeviceManager( this );
    }

    protected override void LoadContent( )
    {
        Block = new Block("Dirt") { Position = new Vector2(100,100) };
    }
}

答案 2 :(得分:0)

假设您的意思是Dirt_Block属于Block类型 - 您的阻止Value字段是静态的 - 这意味着它与{{1}相关联} type,而不是任何特定的实例。将其设为公共字段(或属性),您的访问权限将起作用:

Block

此外,如果没有特别的原因你在这里使用public class BlockType { public static Block Dirt_Block = new Block("Blah! values here"); } public struct Block { public string Value; public Block(string value) { value = value; } } ,我建议将struct作为一个类,并将Value公开为公共财产。

答案 3 :(得分:0)

你的疑问不是很清楚......但我认为你想要的是这样......在块类上使用OOP范例。

public class BlockType
{
    public virtual string Value;

    public static BlockType Dirt = new Block("Blah! values here");
}

public class Block : BlockType
{
    private string value;

    public Block(string value)
    {
        this.value = value;
    }

    public string Value 
    {
        get { return value; }
    }
}

右?