m3n*_*tat 48 c# inheritance abstract-class access-modifiers
我有一个公共程序集/项目,它有一个抽象基类,然后是几个我想公开给其他程序集的派生类.
我不希望抽象基类出现在Intellisense中的这些其他程序集中,所以我想我会成功internal
,但是我得到了这个错误:
可访问性不一致:基类"设置"比"IrcSettings"类更难访问....
我真的不明白.我被迫制作抽象Settings
类public
,因此在这个程序集之外可见.
我怎样才能成为这门课internal
呢?
Rex*_*x M 89
据我所知,您希望您的抽象类只能由同一程序集中的其他类实现(例如,它是内部的),但派生类可以是公共的.
这样做的方法是将抽象基类设为public,但为其提供一个内部默认构造函数:
public abstract class MyClass
{
internal MyClass() { }
}
Run Code Online (Sandbox Code Playgroud)
这将允许MyClass(及其成员)对程序集外的类可见和可用,但程序集外的类不能从它继承(将得到编译错误).
编辑:如果这班可以通过外部组件可看出从MyClass的继承,你不能阻止MyClass的距离也被看作 -例如,显示智能感知的.但是,您可以按照上述方法阻止它们被使用.
抽象基类必须是公共的,因为类的整个继承层次必须是可见的.这确保了多态性的有效性和有效性; 但是所有基类的成员都可以是内部的(包括构造函数),因此在程序集外部不可用
你想要实现的目标确实没有多大好处,但你实际想要实现的目标与此类似.
将您的抽象基类放在1个汇编中,内部包含所有内容.在该程序集的AssemblyInfo中,您需要添加
[assembly:InternalsVisibleTo("cs_friend_assemblies_2")]
Run Code Online (Sandbox Code Playgroud)
然后在另一个程序集中,您将拥有您想要公开的所有类.请注意,对于cs_friend_assemblies_2中的任何代码,或者您为程序集命名的任何代码,您仍然可以从intellisense访问基类,但不能在其他任何位置访问.
您不能同时使该类可用于其他程序集以进行继承,但同时也是私有的,因此其他使用者无法看到它。您可以将类设为内部,并使用该[InternalsVisibleTo]
属性将其公开给特定程序集(如果它是朋友程序集),但我认为这不是您想要的。
如果你想让代码(除了派生类)无法实例化你的基类,你可以给它一个受保护的构造函数:
abstract class MyBaseClass
{
protected MyBaseClass() { ... } // only inheritors can access this...
}
Run Code Online (Sandbox Code Playgroud)
您可以使用以下EditorBrowsable
属性在 Intellisense 中隐藏类成员:
abstract class MyBaseClass
{
[System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]
public void SomeMethodToBeHidden() { }
}
Run Code Online (Sandbox Code Playgroud)
应该注意的是,有些人报告了 IDE 并不总是尊重这个属性的问题。
归档时间: |
|
查看次数: |
22049 次 |
最近记录: |