嵌套内部类:访问父方法并公开嵌套类类型

时间:2017-01-13 00:51:35

标签: c#

我正在编写一个类库,通过以太网命令与一台测试设备连接。该设备可以定义多个轴。主类需要能够发送和接收命令。此外,每个轴都需要能够发送和接收命令。这是一个例子:

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("");
            }
        }
    }
}

1 个答案:

答案 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?