2010-11-05 13 views

Respuesta

9

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(); 
    } 
} 
+0

Genial que funciona genial. ¡Gracias! –

5

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.

http://blogs.msdn.com/b/ericlippert/archive/2008/09/26/preventing-third-party-derivation-part-one.aspx

http://blogs.msdn.com/b/ericlippert/archive/2008/10/06/preventing-third-party-derivation-part-two.aspx

0

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.

+1

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

+0

@mquander ¿No podría simplemente solucionarlo programando en una interfaz? es decir, su firma parecería "DoSomething nulo (elemento IExtendableOrSealed) {...}" – Michael

Cuestiones relacionadas