2011-06-22 208 views
21

Tengo problemas para anular el método de una clase principal en C#. La clase padre se configura de este modo:C# "No se encontró ningún método adecuado para anular". - pero hay uno

public class Base { 
    public Base(Game1 game) 
    { 
     this.game = game; 
    } 

    public virtual void Draw() 
    { 
    } 
} 

... Y la clase hija:

public class Ext : Base { 
    public Ext(Game1 game) : base(game) 
    { 
    } 

    public override void Draw(SpriteBatch batch) 
    { 
    } 
} 

Sé que he anulado con éxito un método de matriz en el pasado, y ahora mismo estoy Probablemente pasando por alto algo increíblemente simple ... ¿qué es?

EDIT: Eso fue en realidad un error tipográfico: en el guión real, Ext deriva de Base. El problema aún persiste. Gracias por las respuestas rápidas, sin embargo. :)

+0

No extendió la clase base 'public class Ext: Base' –

+0

Por favor, muestre su código exacto. El código anterior (post-edición) funcionará bien ... –

Respuesta

23

Su código como se indica (después de la edición) compila bien, así que algo más está mal que no está en lo que usted envió .

Algunas cosas para comprobar, ¿todo es público? Eso incluye tanto la clase como el método.

¿Sobrecarga con diferentes parámetros?

¿Estás seguro de que Base es la clase que crees que es? Es decir. ¿Hay otra clase con el mismo nombre que está haciendo referencia?

Editar:

Para responder a la pregunta en su comentario, no se puede reemplazar un método con parámetros diferentes, tampoco hay una necesidad de hacerlo. Puede crear un nuevo método (con el nuevo parámetro) sin la palabra clave override y funcionará perfectamente.

Si su intención es prohibir la llamada al método base sin el parámetro, puede marcar el método como protected en lugar de public. De esta forma, solo se puede invocar desde clases que hereden de Base

+0

Lo único que queda de los ejemplos del código son los propios constructores. – Jamie

+0

@Jam Necesitará proporcionar un código donde realmente podamos ver el problema; de lo contrario, lo mejor que podemos hacer es adivinar. Obviamente, hay algo más que no se publicó, porque el código dado funciona bien. – Davy8

+0

He actualizado el código en la pregunta; Olvidé agregar el parámetro en la función dibujar. Fue entonces cuando me di cuenta de que la clase base no aceptaba los mismos parámetros que la clase derivada, así que cambié eso y funcionó. Muchas gracias por la ayuda. La pregunta ahora sería: ¿cómo puedo usar diferentes parámetros en el método en la clase derivada? – Jamie

1

Ext necesita heredar la base, por lo que en su definición debe decir:

public class Ext : Base { //... 
+0

Pero sí, eso es increíblemente simple, sin embargo, es el único problema con su código :) –

7

Usted no está heredando de su clase base:

public class Ext : Base { 
    // constructor 

    public override void Draw() 
    { 
    } 
} 
1

Se ha olvidado de derivar de Base

public class Ext : Base 
       ^^^^^^   
1

no veo el Ext clase que se deriva de la Base.

1

Debe heredar de la clase base.

1

Asegúrese de que usted tiene la clase hija hereda de forma explícita la clase padre:

public class Ext : Base { // stuff } 
3

La firma de sus métodos es diferente. Pero para anular un método, la firma debe ser idéntica.

En su caso, la versión de la clase base no tiene parámetros, la versión derivada tiene un parámetro.

Entonces, lo que estás tratando de hacer no tiene mucho sentido.El propósito es que si alguien llama a la función base en una variable que tiene el tipo estático Base pero el tipo Ext en tiempo de ejecución, la llamada ejecutará la versión Ext. Eso obviamente no es posible con diferentes conteos de parámetros.

¿Quizás no desee anular en absoluto?

2

Me encontré con este problema solo para descubrir una desconexión en uno de los objetos de mi biblioteca. Por algún motivo, el proyecto copió el dll de la ruta anterior y no de mi ruta de desarrollo con los cambios. Esté atento a qué dll se están copiando cuando compila.

1

No se puede anular una función con diferentes parámetros, solo se le permite cambiar la funcionalidad del método reemplazado.

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

     } 
    } 
} 
0

Me encontré con una situación similar con el código que estaba funcionando, entonces no lo era.

Girando/soltando el código dentro de un archivo, moví un objeto a otro conjunto de llaves. Me tomó más tiempo darme cuenta de lo que me importa admitir.

Bit una vez que muevo el código a su lugar correcto, se resuelve el error.

0

Probablemente su clase base sea diferente con el mismo nombre. Marque con un clic derecho sobre la clase extendida y vaya a la definición. Verifica si la clase es correcta.

Cuestiones relacionadas