我无法在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。问题仍然存在。但是,谢谢您的快速解答。 :)
答案 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)
您的基类可能是同一个名称不同的基类。通过右键单击扩展类进行检查并转到定义。检查班级是否正确。