En C# ¿es posible crear una clase que se pueda derivar internamente (sin sellar), pero luego evitar que otras personas que hacen referencia a mi biblioteca de forma externa hereden de mi clase pública (sellada)?¿Puedo hacer una clase sin sellar internamente pero externamente sellada?
Respuesta
Supongo que puede hacer el constructor de la clase internal
para que solo otras clases en su ensamblaje puedan derivar de ellos, si todavía necesita crear instancias de esa clase podría proporcionar un método de fábrica para devolver instancias.
de edición para añadir una muestra:
public class MyFoo
{
internal MyFoo()
{
}
public static MyFoo CreateFoo()
{
return new MyFoo();
}
}
Eric Lippert señala tres maneras de hacer esto. tl; dr: no selle su clase, pero incluya un método abstracto interno en su clase, o haga que todos los constructores sean internos o privados, o use el atributo PermissionSet
para agregar metadatos a la clase.
También puede intentar hacer algo como esto.
internal class InternalExtendible
{
public string MyProperty { get; set; }
}
public sealed class ExternalSealedClass : InternalExtendible
{
}
Crea una clase interna y crea una clase vacía pública que hereda de la clase interna. Al hacer referencia al dll, solo la clase pública será visible para el usuario, pero se expondrá toda la funcionalidad de la clase interna.
Ocurrió a mí, pero el gran problema es que si hay métodos accesibles al público que consumen o devuelven este tipo, ¿cuál es la firma? Si usa 'ExternalSealedClass', sus herederos" reales "no serán elegibles. Si usa 'InternalExtensible', sus métodos ya no pueden ser públicos. – mquander
@mquander ¿No podría simplemente solucionarlo programando en una interfaz? es decir, su firma parecería "DoSomething nulo (elemento IExtendableOrSealed) {...}" – Michael
- 1. Sellar una clase
- 2. ¿Por qué sellar una clase?
- 3. Cómo crear una clase que sea abstracta, pero no internamente
- 4. Cómo sellar una propiedad anulado
- 5. ¿Cómo te burlas de una clase Sellada?
- 6. Implementación IDisposable en una clase sellada
- 7. 'Miembro protegido en clase sellada' advertencia (una clase singleton)
- 8. WiX: ¿Cómo puedo establecer una propiedad externamente?
- 9. ¿Por qué harías una clase completa sellada/final?
- 10. Activator.CreateInstance con la clase sellada privada
- 11. ¿Qué es una clase interna sellada en C#?
- 12. ¿Puedo hacer una columna JTable sin bordes?
- 13. ¿Cómo puedo hacer una clase iterable?
- 14. ¿Puedo usar métodos de una clase sin instanciar esta clase?
- 15. ¿Debo preferir la clase sellada o la enumeración en Scala?
- 16. Hacer una clase singleton sin usar el método estático
- 17. Agregar $ LOAD_PATH externamente
- 18. ¿Cómo se puede heredar de una clase sellada usando la reflexión en .Net?
- 19. ¿Debo sellar todas las clases que sé que nunca deberían usarse como una clase base?
- 20. Módulo AutoOpen externamente definido
- 21. Cómo lidiar con una clase sellada cuando quería heredar y agregar propiedades
- 22. Hacer una clase no heredada
- 23. ¿Cómo puedo hacer que vim revise automáticamente si el archivo ha cambiado externamente?
- 24. puedo tener RSpec sin una clase para los métodos
- 25. cómo hacer Html.ActionLink sin texto pero con imagen dentro
- 26. ¿Cómo manejar una clase que desea extender que está sellada en la biblioteca .NET?
- 27. que imita un método que devuelve una clase sellada en RhinoMocks
- 28. ¿Cómo puedo hacer 2 métodos comparables en una sola clase?
- 29. Cómo extender una clase sellada - necesita explicación y uso simple del programa en tiempo real
- 30. ¿Cómo puedo hacer que una Clase se extienda Observable cuando también se ha extendido otra clase?
Genial que funciona genial. ¡Gracias! –