【发布时间】:2020-08-16 11:22:05
【问题描述】:
我有一个包含串行端口的设备的抽象类:
public abstract class SerialDevice
{
// serial port (should this be protected, internal, or protected internal?)
protected SerialPort _serialPort;
// The serial port has some shared methods.
public void Open()
{
_serialPort.Open();
}
}
派生类也使用串行端口,但我不希望端口在这些派生类之外可见。
public class Widget : SerialDevice
{
// The serial port has some widget-specific functionality.
public void UniqueCommand()
{
_serialPort.WriteLine("Hello world.");
}
}
当我编译时,我收到这个警告:CA1051: Do not declare visible instance fields,它表示字段应该是一个隐藏的实现细节。好的,我可以改用受保护的属性,并保护我的类免受破坏内容的更改。
但它继续推荐字段是私有的或内部的。 C# Programming Guide's page on Access Modifiers 表示,使串行端口“受保护”允许它只能在派生类中访问,而使其“内部”允许它在整个程序集中被访问。那么为什么“内部”可以接受,而“受保护”则不行呢?受保护的访问不是比内部访问更不可见吗?
相关问题:What should the accessablity of Fields in a Abstract Class be?
【问题讨论】:
-
你的类是公共的,有一个公共构造函数(因为你的问题没有显示构造函数,我们应该假设它有一个默认构造函数)所以任何程序集中的任何类都可以扩展你的类并可以访问受保护的成员。这就是它抱怨的原因。
-
@OguzOzgul 这很有意义。我无法将抽象类设为私有,否则会收到错误 CS1527(命名空间中定义的元素不能显式声明为私有、受保护、受保护内部或私有受保护)。应该是内部,还是其他?
-
如果我把它 internal 我得到 CS0060(不一致的可访问性:基类 'SerialDevice' 比类 'Widget' 更难访问)。解决办法是什么?
-
让 SerialDevice 是公开的,这就是我们向外部世界公开扩展我们内部抽象类或基类的内部类的方式。只需将其作为内部构造函数即可。保持 _serialPort 内部
标签: c# .net access-modifiers