Ken*_*nic 5 c# abstract-class protected internal
这个问题类似于c#内部抽象类,如何隐藏外部使用但我的动机不同.这是场景
我从以下开始:
internal class InternalTypeA {...}
public class PublicClass
{
private readonly InternalTypeA _fieldA;
...
}
Run Code Online (Sandbox Code Playgroud)
上面的编译很好.但后来我决定提取一个基类并尝试编写以下内容:
public abstract class PublicBaseClass
{
protected readonly InternalTypeA _fieldA;
...
}
Run Code Online (Sandbox Code Playgroud)
因此问题是,受保护的成员在程序集外部是可见的,但是是内部类型,因此它不会编译.
手头的问题是如何(或者我可以?)告诉编译器只有与PublicBaseClass相同的程序集中的公共类可以继承它,因此_fieldA不会在程序集之外公开?
或者是否有另一种方法可以做我想做的事情,有一个公共超类和一组公共基类,它们都在同一个程序集中,并使用它们的公共("受保护")代码中的该程序集的内部类型?
到目前为止我唯一的想法是:
public abstract class PublicBaseClass
{
private readonly InternalTypeA _fieldA;
protected object FieldA { get { return _fieldA; } }
...
}
public class SubClass1 : PublicBaseClass
{
private InternalTypeA _fieldA { get { return (InternalTypeA)FieldA; } }
}
public class SubClass2 : PublicBaseClass
{
private InternalTypeA _fieldA { get { return (InternalTypeA)FieldA; } }
}
Run Code Online (Sandbox Code Playgroud)
但那就是UGLY!
CLR提供了一个FamilyAndAssembly可访问性,可以执行您想要的操作,但C#中没有使用它的语法.
解决方法是将变量字段设置为内部,并且您必须信任程序集中的代码以不适当地访问它.
您还可以将PublicBaseClass的构造函数设置为内部,因此只有您的程序集才能实例化它.这样,只有你的类可以继承它(即使类本身是公共的)