2011-12-25 20 views
7

Me pregunto si hay una manera de limitar quién puede heredar de una clase.¿Hay alguna manera de limitar quién puede heredar una clase o interfaz?

  • internal: no permite que la clase que se hereda el exterior del conjunto
  • sealed: clase no puede ser heredada

¿Hay una palabra clave o una manera de permitir que sólo ciertas clases (digamos desde su propio espacio de nombres) para heredar esa clase?

Además, no quiero que esta clase especial sea genérica. Mi preocupación no es la seguridad sino el diseño en general.

ejemplo de lo que quiero:

  • Clase A.
  • clase B hereda de una
  • Clase C no puede heredar de una
+0

Hacer una clase interna no solo evita que hereden las clases externas, sino que también las usen.Para evitar clases de niños externas, se necesitan trucos especiales, como los métodos 'abstractos ', y eso no funciona en las interfaces. – CodesInChaos

+0

¿Qué tipo de límite te gustaría? ¿Has echado un vistazo a la demanda de herencia? http://palisade.plynt.com/issues/2006Apr/link-demand/ –

+4

Tenga en cuenta que restringir a un espacio de nombres no es mucha protección, ya que un ensamblado pícaro podría decir 'namespace Awesome {public class Stolen: Secret { }} 'y ahora pueden usar' Awesome.Stolen' para acceder a 'Awesome.Secret'. –

Respuesta

16

¿Hay alguna manera de permitir que solo ciertas clases hereden esa clase?

Sí. Si el código de heredar se confiaba parcialmente entonces usted puede poner una demanda herencia en la clase base y el tiempo de ejecución no permitirá que la clase que hereda de cargar si no cumple con las condiciones de la demanda:

https://msdn.microsoft.com/en-us/library/x4yx82e6(v=vs.100).aspx

Por supuesto, plena confianza significa plena confianza. El código completamente confiable puede heredar lo que quiera.

Sospecho que estás tratando de imponer restricciones que realmente no deberías tratar de imponer. ¿Puedes describir por qué estás tratando de hacer esto tan difícil? Probablemente haya una mejor manera de hacer lo que quieras.

ACTUALIZACIÓN:

Estoy intentando limitar la herencia dentro de mis clases en el mismo conjunto.

Entonces probablemente debiste haber dicho eso en primer lugar.

Haga todos los constructores de la clase interna. Para heredar de una clase, debe tener un constructor accesible. Si convierte todos los constructores en internos, solo las clases de ese ensamblaje pueden heredar de la clase base.

+0

Agradable. Aunque no puedo usarlo porque estoy en .Net 3.5 – Odys

+1

@odyodyodys: Las demandas de herencia se envían con .NET v1. –

8

Por lo que yo sé, utilizando internal es la única forma de controlar quién puede heredar una clase. Si los herederos deben estar en un ensamblaje diferente, puede dejar que las clases de otro ensamblaje vean las partes internas de su ensamblaje utilizando el atributo InternalsVisibleTo (el ensamblaje de destino debe estar firmado para que esto funcione con los ensamblajes firmados).

+1

Buena respuesta, pero no necesita firmar para que InternalsVisibleTo funcione. – Andy

+0

@Andy Gracias por aclararnos. Olvidé mencionar que la firma solo es necesaria para las asambleas firmadas. En primer lugar, decidí mencionar la firma, porque recuerdo los problemas que tuve que pasar para descubrir por qué no pude probar los métodos internos de mi ensamblaje firmado desde mi ensamblaje de pruebas de unidades sin firmar. – dasblinkenlight

Cuestiones relacionadas