C# “C”;找不到可重写的合适方法。”但是有一个

C# “C”;找不到可重写的合适方法。”但是有一个,c#,C#,在C#中重写父类的方法时遇到问题。父类的设置如下所示: public class Base { public Base(Game1 game) { this.game = game; } public virtual void Draw() { } } …和儿童类: public class Ext : Base { public Ext(Game1 game) : base(game) { }

在C#中重写父类的方法时遇到问题。父类的设置如下所示:

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

    public virtual void Draw()
    {
    }
}
…和儿童类:

public class Ext : Base {
    public Ext(Game1 game) : base(game)
    {
    }

    public override void Draw(SpriteBatch batch)
    {
    }
}
我知道我过去成功地重写了父方法,而现在我可能忽略了一些非常简单的事情。。。这是什么


EDIT:这实际上是一个输入错误:在实际脚本中,Ext确实来自Base。这个问题仍然存在。不过,感谢您的快速回答。:)

Ext需要继承基,因此在您的定义中,它应该说:

public class Ext : Base { //...

您不是从基类继承:

public class Ext : Base {
    // constructor

    public override void Draw()
    {
    }
}

您忘记了从
Base

public class Ext : Base
                 ^^^^^^        

我看不到类Ext是从基类派生的。

您需要从基类继承。

请确保子类显式继承父类:

public class Ext : Base { // stuff }
您的代码(在编辑之后)编译得很好,因此您发布的内容中没有其他错误

有些东西需要检查,所有东西都是公开的吗?这包括类和方法

不同参数的过载

您确定
Base
是您认为的类吗?也就是说,是否存在另一个与它实际引用的名称相同的类

编辑:

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


如果您打算禁止在没有参数的情况下调用基本方法,则可以将该方法标记为
受保护
,而不是
公共
。这样,它只能从继承自
Base
的类调用。方法的签名是不同的。但要重写方法,签名必须相同

public class Ext : Base
                 ^^^^^^        
在您的情况下,基类版本没有参数,派生版本只有一个参数

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


也许您根本不想重写?

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

不能使用不同的参数重写函数,只允许更改重写方法的功能

//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;

        }
    }
}

我遇到了一个类似的情况,代码可以正常工作,但没有

在文件中拖放代码时,我将一个对象移动到另一组大括号中。我花了比我愿意承认的更长的时间才弄明白


位一旦我将代码移回正确的位置,错误就解决了。

可能您的基类是另一个同名的基类。通过右键单击扩展类并转到定义进行检查。检查课程是否正确

您尚未扩展基类
公共类Ext:base
请显示您的确切代码。上面的代码(后期编辑)可以很好地工作……但是,是的,这非常简单——但是这是您的代码唯一的问题:)代码示例中唯一遗漏的是构造函数本身。@Jam您需要提供我们可以实际看到问题的代码,否则我们只能猜测。很明显还有一些东西没有发布,因为给出的代码很好用;我忘了在draw函数中添加参数。那时我意识到基类不接受与派生类相同的参数,所以我改变了这一点,它工作了。非常感谢你的帮助。现在的问题是:如何在派生类中的方法上使用不同的参数?@Jam您可以使用不同的参数,但不能重写。那怎么办?(除了某些有意义但CLR不允许的方差相关场景)在我的案例中,是区分大小写的C#,方法名称的大小写不同:
ID
vs
ID