En C# ¿Hay manera de especificar una clase para que sea heredada solo por una clase presente en el mismo ensamblaje y para otros ensamblajes debe comportarse como un tipo sellado público.Heredable solo dentro del ensamblaje en C#
Respuesta
Creo que Eric Lippert pone las comillas que definen aquí:
No. No existe tal disposición en el lenguaje C# en sí. Sin embargo, las soluciones alternativas (como sugieren otros aquí) pueden ser suficientes.
votaron arriba, puede que no sea útil, pero es correcto –
Es técnicamente correcto, pero sospecho que Ramesh probablemente ya intuyó ese. Es más útil proporcionar posibles soluciones. –
-1, los votos son útiles, no solo correctos. – Samuel
El lenguaje en sí no tiene nada que lo haga fácil, pero debería poder hacer esto haciendo que sus constructores sean internos. Sin embargo, si hace esto, no podrá actualizarlo desde conjuntos externos, por lo que deberá agregar un método de fábrica.
public class Foo
{
internal Foo()
{
}
public Foo Create()
{
return new Foo();
}
}
Aquí es una alternativa que le permite nuevo a la clase de montajes externos
public sealed class Foo : FooBase
{
}
public class FooBase
{
internal FooBase() { }
}
Una pregunta que cabe preguntarse, sin embargo, es exactamente qué desea que la clase para ser sellado. A veces es inevitable, pero he visto abusar tan a menudo de la palabra clave sealed
que pensé que lo sacaría. A menudo, los desarrolladores sellarán clases porque son sobreprotectores de su código. La mayoría de las veces, si una clase está bien diseñada, no es necesario sellarla.
No sé por qué esto fue downvoted. IMO, es la respuesta más correcta publicada. –
+1 - Para sus pensamientos. Pero el problema es que lo necesito para ConfigurationElementCollection así que no creo que el constructor no pueda hacerse interno en mi caso – Ramesh
Pruebe la segunda solución, cree una clase base que tenga constructores internos y luego impleméntela con una clase sellada que tenga público constructores –
Si la clase es abstracta, no hay una forma muy sencilla de hacerlo:
public abstract class Foo {
internal abstract void DoNothing();
// ... other members
}
Ahora bien, aunque su clase y la mayoría de los miembros son públicos, el miembro abstracta interna hace que sea imposible derivar de la clase fuera de su montaje.
Sugeriría nombrar el método 'PreventExternalInheritance' o algo similar. –
No se puede hacer eso con las construcciones del lenguaje, pero tratar con la reflexión
public class MyClass{
public MyClass(){
if(this.GetType().Assembly != typeof(MyClass).Assembly){
throw new Exception("Can't derive from this type!");
}
}
comprobado hacia arriba. Parece estar funcionando. El único problema es que, a menos que alguien lea la documentación, el problema se conoce en tiempo de ejecución.
Sería bueno si pudiera marcarlo con algún tipo de atributo, como lo hace con el código obsoleto. –
Bueno, siempre puedes agregar al
La única manera que puedo pensar sería utilizar un envoltorio pública en una clase interna, probablemente con una interfaz común:
public interface IFoo
{
}
internal class Foo : IFoo
{
}
public sealed class PublicFoo : IFoo
{
private Foo m_Foo = new Foo();
}
I Sé que esta es una publicación anterior, pero encontré otra manera que funciona muy bien y quise publicarla para otras personas.
- Haz una clase base con un constructor interno.
- Haga que sus clases derivadas hereden de la clase base y se sellen.
`` ``
public abstract class LockResult {
internal LockResult() {
}
}
public sealed class LockSucceededResult : LockResult {
//Info for when a lock succeeded
}
public sealed class LockFailedResult : LockResult {
//Info for when a lock failed
}
`` ``
@Michael answer (https://stackoverflow.com/a/630308/30594) proporciona la misma solución – Ramesh
- 1. Envolviendo una clase no heredable en C#
- 2. ¿Puedo usar C# y C++/CLI en un solo ensamblaje?
- 3. ¿XmlRootAttribute es heredable?
- 4. Uso del ensamblaje en línea en C/C++
- 5. ensambles C#, ¿qué hay en un ensamblaje?
- 6. Ingeniería inversa C-código fuente del ensamblaje
- 7. Definir una variable dentro de ensamblaje C++ línea
- 8. Cómo construir una clase no heredable Y no heredable en Java
- 9. Código de ensamblaje en C++
- 10. ¿Forma simplificada de obtener la descripción del ensamblaje en C#?
- 11. ¿Cómo ver el ensamblaje detrás del código usando Visual C++?
- 12. C#: cómo establecer el número de versión del ensamblaje
- 13. ¿Cómo combino múltiples ensamblados de .NET en un solo ensamblaje?
- 14. escribir los atributos Heredable frente asignación básica en Rails
- 15. Ensamblaje de Maven: ensamblaje
- 16. Cargando múltiples versiones del mismo ensamblaje
- 17. C# Cargar ensamblaje de espacio aislado
- 18. CSS: color de fondo solo dentro del margen
- 19. Cambiar \ parskip solo dentro del entorno enumerar y detallar
- 20. Cómo permitir el acceso solo dentro del país
- 21. Métodos dentro del espacio de nombres C#
- 22. Instalar un ensamblaje en GAC mediante programación
- 23. C# replace string dentro del archivo
- 24. Usando bash (cygwin) dentro del programa C#
- 25. Mezcla C y archivos de ensamblaje
- 26. ¿Cómo obtener el tamaño de una función C desde dentro de un programa C o con un ensamblaje en línea?
- 27. Ensamblaje de Maven: copia solo el archivo de la subcarpeta al extraer del archivo
- 28. Gestión automática del número de versión de ensamblaje en VS2008
- 29. ¿Cómo extraer un ensamblaje del GAC?
- 30. C#: ¿Cómo cargar el ensamblaje desde GAC?
+1 que fue una lectura informativa. De vez en cuando, me encuentro con un blog que afecta mi forma de pensar de forma permenante. Estos fueron dos que hicieron eso. –