C# “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) { }
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
vsID
。