Search code examples
c#oopaccess-modifiers

How can I associate private data with public array elements?


There's a bunch of nodes in 3D space:

public class Node {
    public Vector3 Position;
    public Vector3 Size;
}

Then, there are Path objects which contain an array of nodes. A node can belong to multiple paths. A path has some metadata associated with each of its nodes. The problem is, a path's nodes should be publicly accessible but the associated metadata should stay private.

Unsatisfactory solutions:

Two arrays, a public one for nodes and a private one for metadata, associated by index. Synchronization issues.

A public wrapper type to couple a node with metadata. Doesn't keep the metadata private.

What's a better way to associate private data with array elements?


Solution

  • The idea came from nmclean's answer and comments – a nested wrapper type.

    public class Path {
        
        // wraps a node and its metadata
        private class NodeData {
            // public members visible only to parent class
            public Node Node;
            public float SomeMetadata;
        }
        
        // private array...
        private NodeData[] nodeData;
        
        // ...public method
        public Node GetNode(int index) {
            return nodeData[index].Node;
        }
    }