【问题标题】:Can I make a type "sealed except for internal types"我可以制作“除了内部类型之外的密封类型”
【发布时间】:2010-06-18 18:11:27
【问题描述】:

我想创建一个类型,可以从同一个程序集中的类型继承,但不能从程序集外部继承。我确实希望该类型在程序集之外可见。

这可能吗?

【问题讨论】:

    标签: c# internal sealed


    【解决方案1】:

    您可以将构造函数设为内部:

    public class MyClass
    {
        internal MyClass() { }
    }
    

    从基类派生的每个类都必须在其构造函数中调用基类的构造函数。如果基类在不同的程序集中,它就不能调用构造函数,所以派生类不能编译。

    【讨论】:

    • 你如何在你的程序集之外创建一个实例?
    • @tanascius: 比如添加一个工厂方法?
    • 是的,这是可能的,尽管尚不清楚 OP 是否需要创建实例(他只谈论 visible)... +1
    • public class EvilInternalClass : MyClass { public EvilInternalClass() { } }
    • 请注意,任何static 变量/static 方法/const 值也应标记为internalprivate
    【解决方案2】:

    我认为这个问题仍然可以从语义上正确的答案中受益......这是“否”。您不能将类型声明为“仅对外部程序集密封”。

    不要误会我的意思:dtb 的回答很好。内部构造函数是您可以从所需结果中获得的最接近的构造函数。

    但是,我认为任何阅读本文的人都应该知道,在此示例中,MyClass 不会被描述为在运行时被密封。这不太可能成为问题,但如果可能导致基于反射的逻辑(来自您的代码或第 3 方库)对该特定类型采取不同的行动。这是需要牢记的。

    现在,进一步扩展 dtb 的示例代码:

    public class MyClass
    {
        internal MyClass() { }
    
        // This factory method will be accessible from external assemblies, making your class instantiable yet still "sealed"
        public static MyClass Create()
        {
            return new MyClass();
        }
    }
    

    这样您仍然可以从所属程序集外部创建MyClass 的实例,同时仍保持对继承的控制。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多