2009-03-10 3 views

risposta

0

No. Non esiste una tale disposizione nel linguaggio C# stesso. Tuttavia, soluzioni alternative, come suggerito da altri qui, potrebbero essere sufficienti.

+0

votato up, non può essere utile, ma è corretto –

+0

è tecnicamente corretta, ma ho il sospetto che Ramesh probabilmente già intuito quella. È più utile fornire potenziali soluzioni alternative. –

+0

-1, i voti sono utili, non solo corretti. – Samuel

13

Il linguaggio stesso non ha nulla che lo renda facile, ma dovresti essere in grado di farlo rendendo i tuoi costruttori interni. Se lo fai, tuttavia, non potrai rinnovarlo dagli assembly esterni, quindi dovrai aggiungere un metodo factory.

public class Foo 
{ 
    internal Foo() 
    { 
    } 

    public Foo Create() 
    { 
     return new Foo(); 
    } 
} 

Ecco un'alternativa che consente di nuovo la classe in assembly esterni

public sealed class Foo : FooBase 
{ 

} 

public class FooBase 
{ 
    internal FooBase() { } 
} 

Una domanda si potrebbe chiedere a te stesso, tuttavia, è esattamente perché si desidera la classe da sigillare. A volte è inevitabile, ma ho visto la parola chiave sealed venire maltrattata così spesso che ho pensato di farla apparire. Spesso gli sviluppatori sigillano le classi perché sono iperprotettivi del loro codice. La maggior parte delle volte, se una classe è ben progettata, non ha bisogno di essere sigillata.

+1

Non so perché questo è stato downvoted. IMO, è la risposta più corretta pubblicata. –

+0

+1 - Per i tuoi pensieri. Ma il problema è che ho bisogno di ConfigurationElementCollection quindi, non credo che il costruttore non possa essere reso interno nel mio caso – Ramesh

+0

Prova la seconda soluzione, crea una classe base che ha costruttori interni e poi implementala con una classe sigillata che ha pubblico costruttori. –

4

Se la classe è astratta, c'è un modo molto semplice per farlo:

public abstract class Foo { 
    internal abstract void DoNothing(); 
    // ... other members 
} 

Ora, anche se la classe e la maggior parte dei membri sono pubblici, il membro astratto interna rende impossibile derivare dalla classe fuori della vostra montaggio.

+0

Suggerirei di nominare il metodo "PreventExternalInheritance" o qualcosa di simile. –

1

Non puoi farlo con costrutti del linguaggio, ma cercare con la riflessione

public class MyClass{ 
    public MyClass(){ 
    if(this.GetType().Assembly != typeof(MyClass).Assembly){ 
     throw new Exception("Can't derive from this type!"); 
    } 
} 

Controllato in su. Sembra funzionare. L'unico problema è che a meno che qualcuno legga la documentazione, il problema è noto al runtime.

+0

Sarebbe bello se si potesse contrassegnarlo con una sorta di attributo, come si fa con il codice obsoleto. –

+0

Bene, puoi sempre aggiungere al commento

: "Questa classe non può essere ereditata." – user76035

1

L'unico modo che posso pensare sarebbe quella di utilizzare un wrapper pubblica su una classe interna, probabilmente con un'interfaccia comune:

public interface IFoo 
{ 
} 

internal class Foo : IFoo 
{ 
} 

public sealed class PublicFoo : IFoo 
{ 
    private Foo m_Foo = new Foo(); 
} 
1

I so che questo è un vecchio post, ma ho trovato un altro modo che funziona davvero bene e volevo pubblicarlo per altre persone.

  1. Creare una classe base con un costruttore interno.
  2. Rendi le tue classi derivate ereditate dalla classe base ed essere sigillate.

`` ``

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 
} 

`` ``

+0

@Michael answer (https://stackoverflow.com/a/630308/30594) fornisce la stessa soluzione – Ramesh