C#在超类中调用重写的方法

时间:2011-03-03 05:34:53

标签: c# c#-4.0 xna

嘿那里。我刚刚拿起C#来学习XNA的游戏编程,但我也有一些Java经验。

这是我的代码,实质上是:

public class A
{
    public Rectangle getRectangle()
    {
        return [some rectangle];
    }

    public bool collision(A other)
    {
        Rectangle rect1 = getRectangle();
        Rectangle rect2 = other.getRectangle();
        return rect1.Intersects(rect2);
    }
}

public class B : A
{
    public Rectangle getRectangle()
    {
        return [some other rectangle];
    }
}

当我尝试这样的事情时会出现问题:

A a;
B b;
if(a.collision(b))
    ...

据我所知,B的get矩形版本实际上从未被调用过。 我尝试了一个类似于建议here的解决方案 但我得到的消息基本上是“B.getRectangle()隐藏继承成员A.getRectangle()。如果是这样的话,请使用new关键字。”

我提前感谢我收到的任何帮助。我认为我过去的Java体验正在影响C#的不同之处。我想如果有人知道一个很好的链接可以解释C#和java之间的差异,或者只是知道C#在这方面的工作方式就足够了。

干杯。

4 个答案:

答案 0 :(得分:6)

与Java不同,C#中的方法默认情况下标记为虚拟。您当前的代码正在做的是隐藏 getRectangle方法:派生类中方法声明中有一个隐式new修饰符。

您需要在基类的method-declaration中明确包含virtual修饰符:

public virtual Rectangle getRectangle() { ... }

override在派生类中使用:

public override Rectangle getRectangle() { ... }

答案 1 :(得分:1)

您需要在B类的override方法中使用关键字getRectangle,如下所示:

public override Rectangle getRectangle()

答案 2 :(得分:0)

我不懂Java,但我认为它们有某种方法的虚拟/覆盖语法?

  public class A
  {
    virtual public Rectangle getRectangle()
    {
      return [some rectangle];
    }

    public bool collision(A other)
    {
      Rectangle rect1 = getRectangle();
      Rectangle rect2 = other.getRectangle();
      return rect1.Intersects(rect2);
    }
  }

  public class B : A
  {
     override public Rectangle getRectangle()
     { 
        return [some other rectangle];
     }
   }

答案 3 :(得分:0)

我建议使用Override来改变B中getRectangle()的功能。