0

标题应该很清楚,我无法通过多重继承访问最低级别的属性。

对象 A 扩展对象 B 对象 B 扩展对象 C

对象 C 有一个我想从对象 A 访问的属性,但由于某种原因我只能从对象 B 访问它。适用于变量和函数。

我正在使用自定义库 - 确切地说是“Windows 游戏库(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);
    }
}

}
4

2 回答 2

0

这绝不是一个专家的答案,但你总是可以从 B 类的 C 类中公开你想要的属性,从而从 A 类的基类中访问它们。

我确信有一个更优雅的解决方案,但只是一种镜像(或者它可能被称为隧道?)通过 B 的属性至少应该是可用的。

于 2011-08-25T23:50:44.747 回答
0

命名空间中可能有一个Actor类,ExampleGame或者某个命名空间由 Player 继承的 using 指令导入。这与命名空间Actor中的类不同GridEngine.objects

于 2011-08-26T00:05:39.270 回答