代码之家  ›  专栏  ›  技术社区  ›  Bercovici Adrian

如何在保持派生类内部的同时公开基类

  •  1
  • Bercovici Adrian  · 技术社区  · 6 年前

    你好,我有以下问题:

    我有一个结构

    public struct Cell
    {
       public Node Value;
       public static implicit Cell(Node value)=>new Cell(value); //can't since node less accesible then cell
    }
    

    这个结构 Cell 包含类型为的属性 Node 它是一个抽象基类,目前是 internal 所有的派生类。我需要的是 细胞 结构可供其他开发人员访问,以便他们可以提取 结点 却不知道 结点 派生类。

            internal abstract  class Node{
                    internal class ANode:Node{
                        public byte[] internalValue;
                    }
                    internal class BNode:Node{
                        public int internalValue;
                    }
             }
    

    我怎样才能做到这一点?这个 cell 暴露在外部,因此抽象基类 结点 。用户应该能够从 节点 细胞 是的。

    当前方法
    到目前为止,我尝试的是定义一个接口 IRaw 对于 节点 节点 派生类。显式实现是一个虚拟方法,在派生类中重载。

        interface IRaw{
           byte[] GetRaw();
        }
    
        internal abstract class Node:IRaw
        {
          byte[] IRaw.GetRaw()=>this.GetRaw();
          protected virtual byte[] GetRaw(){ ....}
        }
    
        internal class ANode:Node
        {
          protected override byte[] GetRaw()
          {
            .....
          }
        }
    

    上述方法的问题是我不能通过 伊拉克共和国 作为 细胞 具有错误代码的构造函数: user defined conversions to or from an interface are not allowed 是的。

     public struct Cell
            {
               public IRaw Value;
               public static implicit Cell(IRaw value)=>new Cell(value);
            }
    

    有什么建议吗?我真的需要一个 细胞 是公开的 节点 是内在的。

    1 回复  |  直到 6 年前
        1
  •  3
  •   Sefe    6 年前

    你可以简单地 Node 公开并保持其派生类在内部。与此无关,你应该考虑不要 结点 在嵌套类中以获得更好的可维护性:

    public abstract class Node {
    }
    
    internal class ANode : Node {
        public byte[] internalValue;
    }
    
    internal class BNode : Node {
        public int internalValue;
    }
    

    如果您希望能够创建 ANode BNode 从外部程序集中,可以使用抽象工厂:

    public static class NodeFactory {
        public Node CreateNode(byte[] value) {
            return new ANode { internalValue = value };
        }
    
        public Node CreateNode(int value) {
            return new BNode { internalValue = value };
        }
    }