如何公开基数 class,同时将派生的基数保留在内部

How to expose base class while keeping derived ones internal

您好,我遇到了以下问题:

我有一个结构

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 的 属性,它是一个抽象基础 class,目前是 internal 及其所有派生 classes.What 我需要的是以某种方式让其他开发人员可以访问 Cell 结构,以便他们可以在不知道 Node 派生的 class 的情况下提取 Node 的值。

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

我怎样才能做到这一点? cell 暴露给外部,抽象基础 class Node 也应该如此。用户应该能够从 Node 隐式转换为 Cell

当前方法
到目前为止,我尝试的是为 Node 定义一个接口 IRaw,它从 Node 派生 classes.The 中提取内容,显式实现是一个虚拟方法,在派生 classes.

    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()
      {
        .....
      }
    }

上述方法的问题是我无法将 IRaw 作为参数传递给 Cell 构造函数,错误代码为: 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);
        }

有什么建议吗?我实际上需要 Cell 之间的 "Bridge",即 public 和 Node 的内部内容。

您可以简单地制作 Node public 并将其派生的 类 保留在内部。与此无关,您应该考虑不在嵌套 类 中派生 Node 以获得更好的可维护性:

public abstract class Node {
}

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

internal class BNode : Node {
    public int internalValue;
}

如果您希望能够从外部程序集创建 ANodeBNode 的实例,您可以使用抽象工厂:

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

    public Node CreateNode(int value) {
        return new BNode { internalValue = value };
    }
}