Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#调用超类中的重写方法_C#_C# 4.0_Xna - Fatal编程技术网

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

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

你好。我刚学了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版本实际上从未调用过。 我尝试了一个建议的解决方案 但我得到的消息基本上是“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的虚拟的,新的,覆盖的,抽象的过度。