2010-11-05 10 views

cevap

9

internal sınıfının kurucusunu yapabilmeniz için, derlemenizdeki diğer sınıfların bunlardan türemesini sağlayabilirsiniz, böylece hala bu sınıfın örneklerini oluşturmanız gerekiyorsa, örnekleri döndürmek için bir fabrika yöntemi sağlayabilirsiniz.

public class MyFoo 
{ 
    internal MyFoo() 
    { 
    } 

    public static MyFoo CreateFoo() 
    { 
     return new MyFoo(); 
    } 
} 
+0

Harika çalışıyor. Teşekkürler! –

5

Eric Lippert'ın Bunu yapmak için üç yol notları:

düzenlemek bir örnek ekleyin. tl; dr: sınıfınızı mühürlemeyin, ancak sınıfınızda dahili bir soyut yöntem kullanın ya da tüm kurucuları dahili veya özel yapın ya da sınıfa meta veriler eklemek için PermissionSet özniteliğini kullanın.

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

Ayrıca böyle bir şey yaptığını deneyebilirsiniz.

internal class InternalExtendible 
{ 
    public string MyProperty { get; set; } 
} 

public sealed class ExternalSealedClass : InternalExtendible 
{ 
} 

Bir iç sınıf oluşturun ve iç sınıftan miras alınan ortak bir boş sınıf oluşturun. Dll'ye başvururken, yalnızca genel sınıf kullanıcı tarafından görülebilir, ancak iç sınıfın tüm işlevselliği ortaya çıkar.

+1

Benim için meydana gelen, ancak büyük sorun şu ki bu tip tüketen veya dönen kamu erişilebilir yöntemler varsa - imza nedir? 'ExternalSealedClass' kullanırsanız, 'gerçek' mirasçılarınız uygun olmayacaktır. 'InternalExtensible' kullanıyorsanız, yöntemleriniz artık herkese açık olamaz. – mquander

+0

@mquander Bir arabirime programlama yaparak bunun etrafından dolanmadınız mı? imzanız "void DoSomething (IExtendableOrSealed item) {...}" gibi görünür. – Michael

İlgili konular