C# 正在寻找隐藏类的方法';基类

C# 正在寻找隐藏类的方法';基类,c#,oop,class,class-design,C#,Oop,Class,Class Design,我正在建立一个图书馆,我有如下模式: public class Foo : Foo_Impl { } public class Foo_Impl { } 我不希望其他开发人员意外地使用Foo_Impl类。我可以使用哪些选项来隐藏此内容?我还想对定义它的同一程序集中的其他类隐藏它。理想情况下,我会喜欢做: public class Foo : Foo_Impl { private class Foo_Impl { } } 但是,由于各种原因,这种方法不起作用。没有办法完全隐藏它。

我正在建立一个图书馆,我有如下模式:

public class Foo : Foo_Impl
{
}

public class Foo_Impl
{
}
我不希望其他开发人员意外地使用Foo_Impl类。我可以使用哪些选项来隐藏此内容?我还想对定义它的同一程序集中的其他类隐藏它。理想情况下,我会喜欢做:

public class Foo : Foo_Impl
{
  private class Foo_Impl
  {
  }
}

但是,由于各种原因,这种方法不起作用。

没有办法完全隐藏它。如果
Foo
是公共的,那么它的基类也必须是公共的。但是,通过保护构造函数,可以防止其他开发人员创建
Foo\u Impl
的实例。这样,构造函数只能从派生类中使用

public class Foo_Impl
{
    protected Foo_Impl()
    {
    }
}

public class Foo : Foo_Impl
{
    public Foo() // implicitly calls the base class's protected constructor
    {
    }
}

如果您不想让人们能够创建自己从
Foo\u Impl
派生的类,请将构造函数设置为内部的无法完全隐藏它。如果
Foo
是公共的,那么它的基类也必须是公共的。但是,通过保护构造函数,可以防止其他开发人员创建
Foo\u Impl
的实例。这样,构造函数只能从派生类中使用

public class Foo_Impl
{
    protected Foo_Impl()
    {
    }
}

public class Foo : Foo_Impl
{
    public Foo() // implicitly calls the base class's protected constructor
    {
    }
}

如果您不希望人们能够创建自己从
Foo_Impl
派生的类,请使构造函数内部使
Foo_Impl
成为一个抽象类。这不会阻止其他开发人员从中派生,但它将无法直接创建
Foo_Impl
的实例-需要通过创建派生对象来实例化它,例如
Foo

public abstract class Foo_Impl
{
    public Foo_Impl()
    {
    }
}

public class Foo : Foo_Impl
{
    public Foo() // implicitly calls the base class's constructor
    {
    }
}
-

根据Thomas Levesque的建议,您还可以选择将抽象构造函数设置为内部:

public abstract class Foo_Impl
{
    internal Foo_Impl()
    {
    }
}

public class Foo : Foo_Impl
{
    public Foo() // implicitly calls the base class's constructor
    {
    }
}

这将阻止开发人员从程序集外部继承
Foo\u Impl

使
Foo\u Impl
成为一个抽象类。这不会阻止其他开发人员从中派生,但它将无法直接创建
Foo_Impl
的实例-需要通过创建派生对象来实例化它,例如
Foo

public abstract class Foo_Impl
{
    public Foo_Impl()
    {
    }
}

public class Foo : Foo_Impl
{
    public Foo() // implicitly calls the base class's constructor
    {
    }
}
-

根据Thomas Levesque的建议,您还可以选择将抽象构造函数设置为内部:

public abstract class Foo_Impl
{
    internal Foo_Impl()
    {
    }
}

public class Foo : Foo_Impl
{
    public Foo() // implicitly calls the base class's constructor
    {
    }
}

这将防止开发人员从程序集外部继承来自
Foo\u Impl

您有以下选项:

  • 使Foo_Impl抽象化。开发人员将无法直接实例化Foo_Impl;他们必须申报食物。但是,Foo_Impl仍然可以用作方法参数或泛型类型参数,开发人员可以从Foo_Impl派生自己的类

  • 将Foo_Impl设置为内部,并将其和Foo放置在一个独立的库中,该库与要隐藏Foo_Impl的任何其他类不同。在该程序集之外工作的开发人员将无法看到Foo_Impl。但是,如果开发人员在运行时具有足够的CAS权限,他们可能能够反映该类型并实例化一个,并且任何有权访问程序集源的开发人员都可以在该程序集中新建一个Foo_Impl

  • 使Foo_Impl的所有构造函数受到保护或处于内部。受保护的构造函数只能由派生类访问,而内部构造函数只能从同一程序集中访问。无论哪种方式,Foo_Impl都不能由外部人员实例化。但是,开发人员仍然可以将该类用作参数或泛型类型

  • 使用[Observe]属性将Foo_Impl的构造函数或整个类标记为已过时,指定使用此类会触发错误。这是一种黑客行为,但您既可以防止编译“错误”代码,也可以使用属性的Message参数指定应该使用什么。然而,要注意你的装饰;如果您装饰整个类,我认为编译器不会允许您对该类执行任何操作,包括从该类继承。装饰构造器应该阻止大多数程序员


您可以选择:

  • 使Foo_Impl抽象化。开发人员将无法直接实例化Foo_Impl;他们必须申报食物。但是,Foo_Impl仍然可以用作方法参数或泛型类型参数,开发人员可以从Foo_Impl派生自己的类

  • 将Foo_Impl设置为内部,并将其和Foo放置在一个独立的库中,该库与要隐藏Foo_Impl的任何其他类不同。在该程序集之外工作的开发人员将无法看到Foo_Impl。但是,如果开发人员在运行时具有足够的CAS权限,他们可能能够反映该类型并实例化一个,并且任何有权访问程序集源的开发人员都可以在该程序集中新建一个Foo_Impl

  • 使Foo_Impl的所有构造函数受到保护或处于内部。受保护的构造函数只能由派生类访问,而内部构造函数只能从同一程序集中访问。无论哪种方式,Foo_Impl都不能由外部人员实例化。但是,开发人员仍然可以将该类用作参数或泛型类型

  • 使用[Observe]属性将Foo_Impl的构造函数或整个类标记为已过时,指定使用此类会触发错误。这是一种黑客行为,但您既可以防止编译“错误”代码,也可以使用属性的Message参数指定应该使用什么。然而,要注意你的装饰;如果您装饰整个类,我认为编译器不会允许您对该类执行任何操作,包括从该类继承。装饰构造器应该阻止大多数程序员


    • 我还没有看到这个建议,所以我想我应该加上我的0.02美元

      使用组合而不是继承如何?Foo_Impl的实例可以由Foo维护,外部世界永远看不到它(因为Foo_Impl对程序集是私有的)。呼叫可以通过接口进行传递