¿Posible? ¿Puedes cambiar el acceso de cualquier cosa a cualquier cosa más?C# anular miembro público y hacerlo privado
Respuesta
No, no puede ocultar un miembro del público con un método privado en una subclase, pero no se puede anulación un miembro del público con una privada en una subclase. Y, en realidad, no es solo una cosa pública/privada, esto se aplica a restringir el acceso en general.
revisado: Al ocultar con un acceso más restrictivo - en este caso el acceso privado - le todavía ver el miembro de la clase base desde una clase base o de referencia sub-clase, pero sería ceder ante la nueva método cuando esté disponible desde el nuevo nivel de acceso.
Por lo tanto, en general, cuando se oculta, el cuero tiene prioridad cuando se lo ve en su nivel de acceso. De lo contrario, el método original es el utilizado.
public class BaseClass
{
public virtual void A() { }
public virtual void B() { }
}
public class SubClass
{
// COMPILER ERROR, can't override to be more restrictive access
private override void A() { }
// LEGAL, you can HIDE the base class method, but which is chosen
// depends on level accessed from
private new void B() { }
}
Así SubClass.B()
sólo oculta los métodos de la clase base cuando es accesible. Es decir, si llama al SubClass.B()
dentro de SubClass
, tomará la forma oculta de B()
, pero como B()
es privado, no es visible para las clases fuera de sí, y por lo tanto TODAVÍA ver BaseClass.B()
.
El largo y el corto de él es:
1) No se puede sustituir un método a ser más restrictivas (acceso sabia). 2) Puede ocultar un método con uno más restrictivo, pero solo tendrá un efecto donde ese nuevo tipo de acceso sea visible, de lo contrario, se mantendrá la base.
public class BaseClass
{
public virtual void A() { }
public virtual void B() { }
}
public class SubClass : BaseClass
{
public virtual void A() { B(); }
// legal, you can do this and B() is now hidden internally in SubClass,
// but to outside world BaseClass's B() is still the one used.
private new void B() { }
}
// ...
SubClass sc = new SubClass();
BaseClass bc = new BaseClass();
// both of these call BaseClass.B() because we are outside of class and can't
// see the hide SubClass.B().
sc.B();
bc.B();
// this calls SubClass.A(), which WILL call SubClass.B() because the hide
// SubClass.B() is visible within SubClass, and thus the hide hides BaseClass.B()
// for any calls inside of SubClass.
sc.A();
¿Estás seguro de eso? Parece que rompería el –
de Liskov. Puedes hacerlo. Sin embargo, podría simplemente lanzarlo a 'BaseClass' y llamar al método como si nada hubiera sucedido. – Femaref
@Brian: Sí, ocultar para hacer más restrictivo está permitido. Compila bien.Recuerde que el método aún existe, y siempre que lo trate como una referencia de clase base, todavía está allí y se ejecuta, simplemente no es visible desde una subclase (en el caso de la ocultación privada). No dice que siempre es la mejor opción, OO sabio, pero es posible en C#. –
Nope.
Una forma típica de lidiar con esto es lanzar un NotImplementedException
o algo por el estilo.
'NotImplementedException' implica algo omitido por error. 'NotSupportedException' implica algo omitido por diseño (y posiblemente * todavía * por error, según sea el caso). –
No puede limitar o ampliar la visibilidad de un miembro anulado. Sin embargo, puede definir otro método con la palabra clave new
, que puede darle un nuevo método con el mismo nombre , pero que es incompatible en términos de polimorfismo.
public class A : B
{
public new void Foo()
{
base.Foo();
}
}
Eso no es un ** viaje **, es una ** escritura **. Si convierte esta clase a 'B', el método estará disponible, aunque lo sobreescribió en' A'. – Femaref
@Femaref Técnicamente correcto, el mejor tipo de derecho. –
- 1. Objective-C - Privado vs Protegido vs Público
- 2. Privado o público MSMQ
- 3. Ejemplo de encabezado privado/público?
- 4. Puzzle - exposición de una sub-miembro público de miembro privado con el tipo de encargo
- 5. privado no const y función de miembro público - ¿coexistir en paz?
- 6. C# serializar miembro privado de la clase
- 7. Cambiar automáticamente de público a privado (Java)
- 8. Operador público nuevo, operador privado eliminar: obtener C2248 "no se puede acceder al miembro privado" cuando se usa el nuevo
- 9. Una visión pragmática en privado vs público
- 10. Privado vs público en Cache-Control
- 11. Servidor de repositorio SVN público o privado?
- 12. sangría de modificadores de visibilidad "público" y "privado"
- 13. ¿Por qué hacer que un miembro privado de la clase interna sea público en Java?
- 14. C++ miembro función de acceso privado variable estática?
- 15. ¿Cómo heredar un miembro privado en JavaScript?
- 16. miembro privado de Javascript en el prototipo
- 17. Matriz como miembro privado de la clase
- 18. boost mutex error extraño con miembro privado
- 19. C++ ¿Es privado realmente privado?
- 20. ¿Es posible sobrescribir un miembro privado al crear subclases en C# o Java?
- 21. ¿Por qué un método de interfaz C# implementado en una clase debe ser público?
- 22. Clase de miembro estático: ¿declara clase privada y miembro de clase paquete privado?
- 23. Cifrado privado/público en Python con biblioteca estándar
- 24. ¿Cómo se prueba un par de llaves DSA público/privado?
- 25. Debe copiar el constructor sea privado o público
- 26. Generar pares de claves SSH (privado/público) sin ssh-keygen
- 27. Xcode: encabezados de copia: público vs. privado vs. proyecto?
- 28. ¿Es portable el uso público de typedef privado?
- 29. JRE 1.6 en el repositorio de Maven (público o privado)
- 30. diferencia entre público y público estático?
Escribo ese error exacto al menos una vez al día. –
@Phil: No, OP lo deletreó correctamente. ;) – Yuck
wow Nunca lo noté hasta después de haberlo reparado –