Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

106
Vistas
Superposiciones genéricas abstractas con no genéricas de la clase base

Tengo las siguientes clases base

Los no genéricos:

 public abstract class Foo { public abstract bool DoMagic(string str1, string str2); }

La clase genérica, heredera de la no genérica:

 public abstract class Foo<T> : Foo { public abstract bool DoMagic(T t1, T t2); }

Ahora quiero implementar esta clase.

 public class FooNumeric : Foo<int> { public override bool DoMagic(string str1, string str2) => true; public override bool DoMagic(int int1, int int2) => true; }

Todo funciona como excepción como se puede ver aquí:

https://dotnetfiddle.net/kWQUl9

Ahora me gustaría no usar int como la restricción genérica sino string .

 public class FooString : Foo<string> { public override bool DoMagic(string str1, string str2) => true; //public override bool DoMagic(string int1, string int2) => true; }

Pero parece que no puedo satisfacer al compilador y sigo recibiendo el error

'FooString' no implementa el miembro abstracto heredado 'Foo.DoMagic(string, string)'

https://dotnetfiddle.net/rfncTE

He intentado un par de cosas, pero sin éxito.

es posible?

Soluciones que sé que podrían arreglar esto

  1. Use la clase no genérica en FooString

    No puedo hacer esto porque Foo<T> contiene muchos más métodos genéricos y solo tengo esta superposición en una ocasión.

  2. Cambiar el nombre del método

    si es posible me gustaría ceñirme a los nombres.

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

En mi opinión, el método que recibe parámetros de tipo genérico ( DoMagic(T, T) ) debería tener un nombre más general que el método correspondiente que recibe tipos concretos (por ejemplo DoMagic(string, string) ). No es solo que tengas una colisión sintáctica, sino que también tienes una colisión semántica en el sentido de que los conceptos generales y particulares comparten el mismo nombre.

Aquí hay un esquema de nombres en el que un método más concreto (recibir la string ) tiene un nombre más específico, lo que indica que hará cosas con las cadenas.

 public class Foo<T> { public bool DoMagic(T a, T b) { ... } } public class FooString : Foo<string> { public bool DoMagicWith(string a, string b) { ... } }

Otro esquema de nombres es tener en cuenta que el método general (que recibe el parámetro de tipo genérico) está realizando una operación con una definición más amplia que cualquier método con tipos de parámetros concretos:

 public class Foo<T> { public bool DoAnyMagic(T a, T b) { ... } } public class FooString : Foo<string> { public bool DoMagic(string a, string b) { ... } }
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda