Tengo una clase base y dos clases derivadas:

public abstract class BaseClass {

    public IEnumerable<Double> Inputs { get; protected set; }

    public BaseClass(IEnumerable<Double> inputs) {

        foreach (Double input in inputs)
            Compute(input);
    } 

    protected abstract Double Compute(Double input);
}

public abstract class DerivedClass1 : BaseClass {

    protected abstract Double Compute(Double input);
}

public class DerivedClass2 : DerivedClass1 {

    private override Double Compute(Double input) {

    // Compute implementation

    }
}

Me sale el error en el método DerivedClass1 Compute:

'DerivedClass1.Compute (Double)' oculta el miembro heredado 'BaseClass.Compute (Double)'. Para hacer que el miembro actual anule esa implementación, agregue la palabra clave de anulación.

¿Cómo resolver esto?

0
Miguel Moura 17 dic. 2019 a las 01:40

2 respuestas

La mejor respuesta

No necesita volver a declarar este método como abstracto nuevamente, simplemente elimínelo:

public abstract class DerivedClass1 : BaseClass {
}

Sin embargo, deberá proporcionar un constructor, porque BaseClass no tiene un constructor predeterminado y requiere una instancia para crear un argumento.

7
BartoszKP 16 dic. 2019 a las 22:44

Hay dos cosas que pueden suceder con las funciones cuando hereda las clases: anulación y ocultación.

Esconderse es el tipo de cosa que se inventó muy temprano al pensar en la idea de OOP. Entonces todos lo implementan. No recuerdo haberlo usado alguna vez, haber visto a alguien usarlo o incluso pensar seriamente en usarlo en código. La razón principal para saberlo es no hacerlo accidentalmente en lugar de anularlo.

La anulación es la forma más útil. Lo usas el 99.999% de todos los casos. El único inconveniente es que la opción de anulación debe ser etiquetada y mantenida en cada paso de la cadena de herencia que implementa la función. Si me encuentro con un caso en el que no puedo anular, solo hay una Opción: encapsular esto en otra clase que puedo anular.

Estoy muy sorprendido de que esconderse hayan sido clases como un error del compilador. Sin embargo, también estoy recibiendo 4 otros errores < a href = " https://sharplab.io/#v2:EYLgxg9gTgpgtADwGwBYA+ABATARgLABQGADAAQY4oDchhGAzKQIbADOALlE2O+VqQCEmrGAGEANsNakA3rQKlF5RhXoAeACIQArsHEwAfKQCSAOwAO29tJmkA5jHZVS5qBHYweMACakRT0gBfeSVlQWExSVZWAApVTR09Q1IASwsrVgBKWRDQpQAzaBhuAAtSGK1dfVT03jSay2tMwjzW0lEIAFtGmBi0xsyaBSVA0lzFV3dPD18WDi4eUkqk9q6eisTq/qtBwmCCOkY5zm5ebCWYKBSANx8JKRxSEHCRe+icg+GJtw8vWbYTotltUOt0rL1gTAGjshvtDnwLldbt43qx+M8NJcbncoqxHnJPqFXDcmB5SBBblArt4oZDVmCPBsqlDtuxsgSWnl2CU3AB3UimGD8gCiCDAMHM7BSEFMMV2hJGeyAA== " rel = " nofollow noreferrer "> en ese código . Principalmente cosas sobre los accesores que no coinciden con el comportamiento de anulación / ocultación (debe estar al menos protegido y no se puede cambiar la accesibilidad después). Por lo tanto, bien podría ser un caso en el que el análisis se ha disparado tanto, que comienza a inventar problemas que no importan.

Mientras una clase sea abstracta, no necesita codificar nada. Las clases abstractas están ahí para obtener un "paso" en la jerarquía de clases. He visto clases abstractas utilizadas para recopilar interfaces y nada más. La implementación actual todavía era 100% el trabajo de los herederos. La codificación de las cosas es completamente opcional: no tener que codificar las cosas suele ser el objetivo.

0
Christopher 16 dic. 2019 a las 23:49