многоуровневое наследование xna - невозможно получить доступ к свойствам базового класса - PullRequest
0 голосов
/ 26 августа 2011

Название должно быть ясным, у меня проблемы с доступом к свойствам самого низкого уровня с множественным наследованием.

Объект A расширяет Объект B Объект B расширяет Объект C

Объект C имеет свойство, к которому я хочу получить доступ из объекта A, но по какой-то причине я могу получить к нему доступ только из объекта B. Идет как для переменных, так и для функций.

Я использую пользовательскую библиотеку - если быть точным, "Windows Game Library (4.0)". У меня никогда не было проблем с этим, когда я не пользовался библиотекой. Единственное отличие сейчас и тогда заключалось в том, что я сейчас использую ключевое слово «public» для классов в библиотеке, потому что в противном случае я получу «недоступную» ошибку.

В коде:

Объект A

    namespace ExampleGame
{
    class Player : Actor
    {

    public Player()
    {
        //most things happen in gameobject<actor<this
        MaxSpeed = new Vector2(10, 10);
        Acceleration = new Vector2(5, 5);
        Velocity = new Vector2(0, 0);
        MaxJumpPower = 15;
    }


    override public void Update()
    {
        base.Update();

        manageInput();
    }

}
}

Объект B

namespace GridEngineLibrary.objects
{
 public class Actor : GameObject
    {
    public int MaxJumpPower;

    public Actor()
    {
        canMove = true;
    }

    /// <summary>
    /// moves the object but it's acceleration
    /// </summary>

    public void jump()
    {

        if (grounded == true)
        {
            Console.WriteLine("jump!");
            Direction.Y = -1;
            Velocity.Y = MaxJumpPower * -1;
        }
    }

}
}

Объект C

    namespace GridEngineLibrary.objects
{
    public class GameObject
    {
        public Vector2 location;
        public SpriteBatch spritebatch;
        public Vector2 hitArea;
        public AnimatedTexture graphic;

    public Vector2 Velocity;
    public Vector2 Acceleration;
    public Vector2 MaxSpeed;
    public Vector2 Direction;
    public int Z = 1;

    public bool canMove;

    public GameObject()
    {
        spritebatch = SpriteManager.spriteBatch;
    }

    /// <summary>
    /// set the animated texture 
    /// </summary>
    /// <param name="location"></param>
    /// <param name="size"></param>
    /// <param name="TextureName">name of texture to load</param>
    public void setAnimatedTexture(Vector2 location, Vector2 size, string TextureName, 
                                    int totalFrames, int totalStates, int animationSpeed = 8, 
                                    int spacing = 9)
    {
        graphic = new AnimatedTexture(location, size, TextureName);
        graphic.isAnimated = true;
        graphic.totalStates = totalStates;
        graphic.totalFrames = totalFrames;
        graphic.animationSpeed = animationSpeed;
        graphic.spacing = spacing;

        hitArea = size;
    }


    virtual public void Update()
    {
        graphic.update(location);
    }
}

}

Ответы [ 2 ]

0 голосов
/ 26 августа 2011

Может быть класс Actor в пространстве имен ExampleGame или некоторое пространство имен, импортированное с помощью директивы using, от которой наследуется Player.Это не будет тот же класс Actor, что и в пространстве имен GridEngine.objects.

0 голосов
/ 26 августа 2011

Это ни в коем случае не экспертный ответ, но вы всегда можете просто предоставить нужные вам свойства из класса C в классе B и, таким образом, получить к ним доступ из базы в классе A.

Я уверен, что есть более элегантное решение, но просто как бы зеркальное отражение (или, возможно, это будет называться туннелированием?), Свойства через B должны, по крайней мере, быть исправными.

...