Подтвердить что ты не робот

С# "Не найдено подходящего метода для переопределения". - но есть один

У меня возникли проблемы с переопределением метода родительского класса в С#. Родительский класс настроен так:

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 выводит базу. Проблема все еще сохраняется. Спасибо за быстрые ответы.:)

4b9b3361

Ответ 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

Я столкнулся с аналогичной ситуацией с кодом, который работает, но не был.

Повернувшись при перетаскивании/удалении кода внутри файла, я переместил объект в другой набор фигурных скобок. Уделил больше времени, чтобы понять, чем я хотел бы признать.

Бит, когда я верну код обратно в нужное место, ошибка устранена.