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

时间:2011-06-22 20:17:24

标签: 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)
    {
    }

    public override void Draw(SpriteBatch batch)
    {
    }
}

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

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

12 个答案:

答案 0 :(得分:28)

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

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

使用不同的参数进行过载?

您确定Base是您认为的课程吗?即是否有另一个与其实际引用的同名的类?

编辑:

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

如果您打算禁止在没有参数的情况下调用基本方法,则可以将方法标记为protected而不是public。这样,它只能从继承自Base

的类中调用

答案 1 :(得分:7)

您不是从基类继承的:

public class Ext : Base {
    // constructor

    public override void Draw()
    {
    }
}

答案 2 :(得分:4)

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

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

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

也许你根本不想覆盖?

答案 3 :(得分:2)

Ext需要继承基数,所以在你的定义中应该说:

public class Ext : Base { //...

答案 4 :(得分:2)

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

答案 5 :(得分:1)

您忘记了从Base

派生
public class Ext : Base
                 ^^^^^^        

答案 6 :(得分:1)

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

答案 7 :(得分:1)

您需要从基类继承。

答案 8 :(得分:1)

确保您的子类显式继承父类:

public class Ext : Base { // stuff }

答案 9 :(得分:1)

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

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

        }
    }
}

答案 10 :(得分:0)

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

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

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

答案 11 :(得分:0)

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