Sé que ha habido varias respuestas a esto, y es bastante viejo ahora, pero el método más simple para hacer esto es simplemente declararlos como new private
.
Considere un ejemplo en el que estoy trabajando actualmente, donde tengo una API que pone a disposición todos los métodos en una DLL de terceros. Tengo que tomar sus métodos, pero quiero usar una propiedad .Net, en lugar de un método "getThisValue" y "setThisValue". Entonces, construyo una segunda clase, heredo la primera, hago una propiedad que usa los métodos get y set, y luego anulo los métodos get y set originales como privados. Todavía están disponibles para cualquiera que quiera construir algo diferente en ellos, pero si solo quieren usar el motor que estoy construyendo, entonces podrán usar propiedades en lugar de métodos.
Al utilizar el método de clase doble se elimina cualquier restricción al no poder usar la declaración new
para ocultar los miembros. Simplemente no puede usar override
si los miembros están marcados como virtuales.
public class APIClass
{
private static const string DllName = "external.dll";
[DllImport(DllName)]
public extern unsafe uint external_setSomething(int x, uint y);
[DllImport(DllName)]
public extern unsafe uint external_getSomething(int x, uint* y);
public enum valueEnum
{
On = 0x01000000;
Off = 0x00000000;
OnWithOptions = 0x01010000;
OffWithOptions = 0x00010000;
}
}
public class APIUsageClass : APIClass
{
public int Identifier;
private APIClass m_internalInstance = new APIClass();
public valueEnum Something
{
get
{
unsafe
{
valueEnum y;
fixed (valueEnum* yPtr = &y)
{
m_internalInstance.external_getSomething(Identifier, yPtr);
}
return y;
}
}
set
{
m_internalInstance.external_setSomething(Identifier, value);
}
}
new private uint external_setSomething(int x, float y) { return 0; }
new private unsafe uint external_getSomething(int x, float* y) { return 0; }
}
Ahora valueEnum está disponible para ambas clases, pero solo la propiedad está visible en la clase APIUsageClass. La clase APIClass todavía está disponible para las personas que desean extender la API original o usarla de una manera diferente, y APIUsageClass está disponible para aquellos que quieren algo más simple.
En última instancia, lo que haré es hacer que el APIClass sea interno y solo exponer mi clase heredada.
¿No puede sellarlo, también, con el mismo efecto? –
@JamesM no obselete con verdadero impide miembro _acceso_, sellado previene miembro _herida_. Por lo tanto, no se puede derivar una clase sellada, y un método sellado permite anular a otros miembros de la clase, pero impide que ese miembro sea anulado. Sealed no impide llamar a esa clase o miembro, mientras que obselete con verdadero arroja un error de compilación si intentas llamarlo. –
@RobertPetz cuando se usa obsoleto, da una advertencia, no un error. Gran diferencia. –