C#调用超类中的重写方法
你好。我刚学了C#来学习XNA的游戏编程,但我也有一些Java方面的经验 这是我的代码,本质上:C#调用超类中的重写方法,c#,c#-4.0,xna,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 r
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版本实际上从未调用过。
我尝试了一个建议的解决方案
但我得到的消息基本上是“B.getRectangle()隐藏继承的成员A.getRectangle()。如果需要,请使用new关键字。”
我预先感谢我得到的任何帮助。我认为我过去的java经验妨碍了我理解C#的不同之处。我想如果有人知道一个很好的链接来解释C#和java之间的区别,或者C#在这方面是如何工作的,那就足够了
干杯。对于类B中的
getRectangle
方法,您需要使用关键字override
,如下所示:
public override Rectangle getRectangle()
我不懂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];
}
}
我建议使用Override来更改B中getRectangle()的功能。与Java不同,C#中的方法在默认情况下没有标记为虚拟。当前代码所做的是隐藏
getRectangle
方法:在派生类中的方法声明上有一个隐式new
修饰符
您需要在基类的方法声明中显式包含virtual
修饰符:
public virtual Rectangle getRectangle() { ... }
和在派生类中重写它,方法是:
public override Rectangle getRectangle() { ... }
这样的解决办法让我觉得很傻。在再次提出此类问题之前,我将更深入地了解C#中的继承。也许还可以对调试进行更好的尝试。谢谢。@DevynS:不客气。请将此标记为答案和/或向上投票,如果它对您有所帮助。隐性新的道具。我不知道语言会这样做。@Ritch:这是概念上的东西。你不必这样想——这只是一种避免“脆弱基类”问题的方法。我只是假设它不会编译。我使用resharper,所以我也从未尝试过。看看这个——“但我假设它们有某种虚/重写语法”。没有Java具有隐式虚拟和重写。所以所有的方法都是虚拟的,相同名称的方法总是充当覆盖。哦,哇。我认为它们是C++虚拟的,C的虚拟的,新的,覆盖的,抽象的过度。