我正在编写一个类库,通过以太网命令与一台测试设备连接。该设备可以定义多个轴。主类需要能够发送和接收命令。此外,每个轴都需要能够发送和接收命令。这是一个例子:
public class TestEquipment
{
private TcpClient _tcpClient;
private NetworkStream _networkStream;
public Axis[] Axes; // Variable should be accessible publicly
public TestEquipment()
{
Axes = new Axis[2];
Axes[0] = new Axis();
Axes[1] = new Axis();
}
public void Initialize()
{
// Use send/receive method to initialize the device
}
internal string SendReceive(string command)
{
return // Uses _tcpClient and _networkStream to talk to the device
}
internal class Axis
{
public double Angle
{
get
{
// Use send/receive method from parent class to get the axis angle
}
set
{
// Use send/receive method from parent class to set the axis angle
}
}
}
}
现在我有两个不同的问题。首先是我在Axes
下为行public Axis[] Axes
设置了红色曲线,因为Axis比Axes更难以访问。第二个问题是我不确定如何使用SendReceive
类及其内部TestEquipment
类中的Axis
。
如果Axes问题不是嵌套和公开的,可以修复它,但我不希望在Axis
之外创建任何TestEquipment
。
如果我将方法和TcpClient和NetworkStream放在一个静态类中并使它们变为静态但是看起来很难看,我可以在两个类中使用SendReceive
。
以下是如何使用它的快速摘录:
var device = new TestEquipment();
device.Initialize();
device.Axes[0].Angle = 90;
这些不应该在TestEquipment
类之外:
device.SendReceive("");
var newAxis = new Axis();
不幸的是我无法共享我的实际代码,因此如果需要,我可以添加到我的示例代码中。如果需要进一步澄清,我很乐意这样做。
答案
以下是工作代码:
public class TestEquipment
{
private TcpClient _tcpClient;
private NetworkStream _networkStream;
public Axis[] Axes;
public TestEquipment()
{
Axes = new Axis[2];
Axes[0] = new Axis(this);
Axes[1] = new Axis(this);
}
public void Initialize()
{
// Use send/receive method to initialize the device
}
private string SendReceive(string command)
{
}
public class Axis
{
private TestEquipment _parent;
internal Axis(TestEquipment parent)
{
_parent = parent;
}
public double Angle
{
get
{
return _parent.SendReceive("");
}
set
{
value = _parent.SendReceive("");
}
}
}
}
答案 0 :(得分:1)
您似乎对internal
所做的事情有错误的印象:它限制了对同一个程序集中的类的访问,而不是同一个类。
为了防止在device.SendReceive("");
之外TestEquipment
成为可能,您需要将其设为private
而不是internal
。
对于Axis
,您可以将其嵌套(或不嵌套),但将其设为public
,并为其指定internal
构造函数:
public class Axis
{
internal Axis() { }
public double Angle { get; set; } // and so on
}
这会阻止C#自动生成一个公共无参数构造函数,并使其Axis
只能在Assembly中构造。
不幸的是,没有办法将它限制在外层,尽管有一些解决方法,在这个问题的答案中有所描述:How to restrict access to nested class member to enclosing class?