你好。我刚拿起 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 rectangle 实际上从未被调用过。 我尝试了建议的解决方案 here 但我得到的消息基本上是“B.getRectangle() 隐藏了继承的成员 A.getRectangle()。如果这是有意的,请使用 new 关键字。”
我提前感谢我收到的任何帮助。我认为我过去的 Java 经验妨碍了理解 C# 的不同之处。我想如果有人只知道一个很好的链接来解释 C# 和 java 之间的差异,或者 C# 在这方面的工作方式就足够了。
干杯。
最佳答案
与 Java 不同,C# 中的方法默认不标记为虚拟的。您当前的代码正在做的是隐藏 getRectangle
方法:在派生类中的方法声明中有一个隐式的new
修饰符。
您需要在基类的方法声明中显式包含 virtual
修饰符:
public virtual Rectangle getRectangle() { ... }
并在派生类中覆盖
它:
public override Rectangle getRectangle() { ... }
关于C# 在父类(super class)中调用重写的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5177051/