【问题标题】:Pull child from a array of type parent and use the child's overwritten method从 parent 类型的数组中拉出 child 并使用 child 的覆盖方法
【发布时间】:2012-01-31 23:46:00
【问题描述】:
    public Block[,] Layer2ID;
    Layer2ID[X, Y].Draw(spriteBatch, new Vector2(X * 32, Y * 32)); //Child of Block, let's call it Wall

Layer2ID 填充了 Block 的子数组,但属于 Block 类型,因此,当我调用绘图函数时,它使用 Block 的绘图函数而不是孩子的绘图函数。为什么会这样,我该如何解决?

谢谢。

【问题讨论】:

  • 听起来您分别在基类/子类方法上缺少虚拟/覆盖修饰符。
  • 我从未听说过这些 * 研究 * 啊哈,谢谢!
  • 通常,当您的类实现覆盖另一个没有override 关键字的方法时,您会收到一个编译器警告,该方法或属性对基类隐藏了相同的方法或属性。请务必检查您的编译器警告以获取此信息。

标签: c# arrays map xna draw


【解决方案1】:

从你的描述看来,你有这样的东西

class Block 
{
    public void Draw(SomeObj spriteBatch, Vector2 vector) { }
}

class Wall : Block
{
    public void Draw(SomeObj spriteBatch, Vector2 vector) { }
}

Wall 中的方法是隐藏在 Block 中的方法,它不是虚拟的。您甚至可以在 Wall 内部的方法上使用 new 修饰符,因为编译器通常会警告您隐藏方法并推荐新关键字来标记您的意图。此隐藏方法仅通过 Wall 引用调用,而不是通过 Block 引用调用。

例如,与 Java 不同,C# 中的方法默认情况下不是虚拟的,您必须将它们标记为虚拟。要多态地使用您的方法,请将 virtual 和 override 修饰符分别应用于基类和派生类中的方法。

class Block 
{
    public virtual void Draw(SomeObj spriteBatch, Vector2 vector) { }
}

class Wall : Block
{
    public override void Draw(SomeObj spriteBatch, Vector2 vector) { }
}

有了这个,覆盖的方法将被调用。

Block block = new Wall();
block.Draw(spriteBatch, vector); // should observe derived behavior
Layer2ID[x, y].Draw(spriteBatch, vector); // same, if this element is a Wall

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    • 2016-03-22
    • 2017-08-13
    • 2018-11-05
    相关资源
    最近更新 更多