С# "Не найдено подходящего метода для переопределения". - но есть один
У меня возникли проблемы с переопределением метода родительского класса в С#. Родительский класс настроен так:
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:. Это была опечатка: в фактическом script Ext выводит базу. Проблема все еще сохраняется. Спасибо за быстрые ответы.:)
Ответы
Ответ 1
Ваш код как заданный (после редактирования) компилируется отлично, так что что-то не так, что не в том, что вы разместили.
Некоторые вещи, чтобы проверить, все ли открыто? Это включает как класс, так и метод.
Перегрузка с различными параметрами?
Вы уверены, что Base
- это класс, который вы так считаете? То есть есть ли другой класс с тем же именем, на который он ссылается?
Edit:
Чтобы ответить на вопрос в своем комментарии, вы не можете переопределить метод с разными параметрами, и нет необходимости. Вы можете создать новый метод (с новым параметром) без ключевого слова override
, и он будет работать нормально.
Если вы намерены запретить вызов базового метода без параметра, вы можете пометить его как protected
вместо public
. Таким образом, его можно вызывать только из классов, наследующих от Base
Ответ 2
Вы не наследуете свой базовый класс:
public class Ext : Base {
// constructor
public override void Draw()
{
}
}
Ответ 3
Подпись ваших методов отличается. Но для переопределения метода подпись должна быть идентичной.
В вашем случае версия базового класса не имеет параметров, производная версия имеет один параметр.
То, что вы пытаетесь сделать, не имеет большого смысла. Цель состоит в том, что если кто-то вызывает базовую функцию для переменной, которая имеет статический тип Base
, но тип Ext
во время выполнения, вызов будет запускать версию Ext
. Это, очевидно, невозможно при разных значениях параметров.
Возможно, вы вообще не хотите переопределять?
Ответ 4
Я столкнулся с этой проблемой только для обнаружения отключения в одном из моих объектов библиотеки. По какой-то причине проект копировал dll со старого пути, а не из моего пути разработки с изменениями. Следите за тем, какие DLL копируются при компиляции.
Ответ 5
Ext необходимо наследовать базу, поэтому в вашем определении она должна сказать:
public class Ext : Base { //...
Ответ 6
Вы забыли получить от Base
public class Ext : Base
^^^^^^
Ответ 7
Я не вижу, чтобы класс Ext был получен из Base.
Ответ 8
Вам нужно наследовать из базового класса.
Ответ 9
Убедитесь, что дочерний класс явно наследует родительский класс:
public class Ext : Base { // stuff }
Ответ 10
Вы не можете переопределить функцию с разными параметрами, только вам разрешено изменять функциональность переопределенного метода.
//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;
}
}
}
Ответ 11
Я столкнулся с аналогичной ситуацией с кодом, который работает, но не был.
Повернувшись при перетаскивании/удалении кода внутри файла, я переместил объект в другой набор фигурных скобок. Уделил больше времени, чтобы понять, чем я хотел бы признать.
Бит, когда я верну код обратно в нужное место, ошибка устранена.