这是我的代码,实质上是:
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#在这方面的工作方式就足够了。
干杯。
答案 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()的功能。