C#“找不到合适的方法来覆盖。” – 但是有一个

我无法在C#中覆盖父类的方法。 父类的设置如下:

public class Base { public Base(Game1 game) { this.game = game; } public virtual void Draw() { } } 

……和孩子class:

 public class Ext : Base { public Ext(Game1 game) : base(game) { } public override void Draw(SpriteBatch batch) { } } 

我知道我过去成功地覆盖了一个父方法,现在我可能忽略了一些非常简单的东西……它是什么?

编辑:这实际上是一个错字:在实际的脚本中,Ext确实来自Base。 问题仍然存在。 但是,谢谢您的快速解答。 🙂

你给出的代码(在编辑之后)编译得很好,所以其他错误不是你发布的内容。

有些事要检查,一切都是公开的吗? 这包括类和方法。

使用不同参数进行过载?

你确定Base是你认为的类吗? 即它是否有另一个同名的类,它实际上是引用它?

编辑:

要回答评论中的问题,您不能使用不同的参数覆盖方法,也不需要。 您可以创建一个没有override关键字的新方法(使用新参数),它可以正常工作。

如果您的目的是禁止在没有参数的情况下调用base方法,则可以将方法标记为protected而不是public 。 这样它只能从inheritanceBase类中调用

你不是从你的基类inheritance的:

 public class Ext : Base { // constructor public override void Draw() { } } 

您的方法的签名是不同的。 但要覆盖方法,签名必须相同。

在您的情况下,基类版本没有参数,派生版本有一个参数。

所以你要做的事情没有多大意义。 目的是,如果有人在具有静态类型Base但在运行时类型为Ext的变量上调用基函数,则调用将运行Ext版本。 对于不同的参数计数,这显然是不可能的。

也许你根本不想覆盖?

Ext需要inheritancebase,所以在你的定义中它应该说:

 public class Ext : Base { //... 

我遇到这个问题只是为了发现我的一个库对象断开连接。 出于某种原因,该项目是从旧路径复制dll而不是从我的开发路径复制更改。 在编译时要密切注意复制的dll。

你忘了从Base派生

 public class Ext : Base ^^^^^^ 

我没有看到类Ext是从Base派生的。

您需要从基类inheritance。

确保您让子类显式inheritance父类:

 public class Ext : Base { // stuff } 

您不能使用不同的参数覆盖函数,只允许您更改被覆盖方法的function。

 //Compiler Microsoft (R) .NET Framework 4.5 using System; using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; //Overriding & overloading namespace polymorpism { public class Program { public static void Main(string[] args) { drowButn calobj = new drowButn(); BtnOverride calobjOvrid = new BtnOverride(); Console.WriteLine(calobj.btn(5.2, 6.6).ToString()); //btn has compleately overrided inside this calobjOvrid object Console.WriteLine(calobjOvrid.btn(5.2, 6.6).ToString()); //the overloaded function Console.WriteLine(calobjOvrid.btn(new double[] { 5.2, 6.6 }).ToString()); Console.ReadKey(); } } public class drowButn { //same add function overloading to add double type field inputs public virtual double btn(double num1, double num2) { return (num1 + num2); } } public class BtnOverride : drowButn { //same add function overrided and change its functionality //(this will compleately replace the base class function public override double btn(double num1, double num2) { //do compleatly diffarant function then the base class return (num1 * num2); } //same function overloaded (no override keyword used) // this will not effect the base class function public double btn(double[] num) { double cal = 0; foreach (double elmnt in num) { cal += elmnt; } return cal; } } } 

我遇到类似的情况,代码是WAS工作,然后不是。

在文件中拖放代码时转动,我将一个对象移动到另一组括号中。 花了很长时间才弄清楚比我承认的要多。

比特一旦我将代码移回适当的位置,错误就解决了。

可能你的基类是一个具有相同名称的基类。 右键单击扩展类进行检查,然后转到定义。 检查class级是否正确。