Pregunta

Hay una clase base (caja negra; no puedo modificarla) de la que obtengo. En mi clase derivada, ya no quiero permitir que los usuarios usen una propiedad, sino que ahora tengo una función pública para usar. No entraré en los detalles de por qué (es irrelevante), pero aquí está la propiedad que estoy tratando de ocultar:

public ComboBoxItemCollection Items { get; }

He intentado esto, pero no funcionó:

private new ComboBoxItemCollection Items { get; set; }

También probé esto, sin embargo, el compilador dice que no se me permite hacer que ambos accesorios sean privados:

public new ComboBoxItemCollection Items { private get; private set; }

¿Cómo logro correctamente esto? Tenga en cuenta que no estoy dependiendo de que esta sea una solución de seguridad completa, obviamente a través de medio de lanzar a la clase base que aún pueden llamar a esta propiedad. Esto simplemente está destinado a ofrecer al usuario un error de tiempo de compilación, lo que ayuda a guiarlos a darse cuenta de que no puede usar esta propiedad y, en su lugar, debe usar la nueva función en la clase derivada.

EDITAR

Gracias a las respuestas en este hilo, se me ocurrió la siguiente solución:

    [Obsolete( "This property is obsolete. Please use MRUIdComboBox.AddItem() instead.", true )]
    public new ComboBoxItemCollection Items
    {
        get
        {
            throw new NotSupportedException( "This property is not supported. Please use MRUIdComboBox.AddItem() instead." );
        }
    }
¿Fue útil?

Solución

No puedes. Lo más cerca que pudiste estar:

[Obsolete(IsError=true)]
public new ComboBoxItemCollection Items
{
    get { return base.Items; } // Or throw an exception
}

Personalmente, estaría tentado a preguntar si realmente debería derivar de esto si no quiere a todos los miembros ... ¿puede usar composición en su lugar?

Otros consejos

Incluso si fuera posible, realmente no desea "ocultar" a los accesorios (como ha señalado, se puede acceder a ellos a través de la clase base). Está después de una advertencia/error que dice "este método está en desuso y debe evitarse". Como tal, es posible que desee mirar el Atributo obsoleto, documentado como "el atributo obsoleto se usa para marcar tipos y miembros de tipos que ya no deberían usarse", exactamente su caso de uso.

EDITAR: Aconsejo que no arroje una excepción en el accesor. Esto violaría lo que comúnmente se llama el "principio de sustitución de Liskov": que puede usar una clase derivada en cualquier lugar donde se desee una clase base. Realmente, ese es un lenguaje elegante en torno al hecho de que el código existente en el que podría pasar una instancia derivada está esperando un .Items Getter que funciona de manera sensata, en lugar de explotar en contacto. Si lanza una excepción, es posible que tenga dificultades para depurar errores en lugares muy difíciles de alcanzar (dado que su superclase es una caja negra).

Puede hacer pública la propiedad en la clase infantil y organizar una excepción si se accede. Debe asegurarse de que solo acceda a la propiedad de la clase base dentro de la clase infantil.

public new ComboBoxItemCollection Items
{
    get { throw new InvalidOperationException(); }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top