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

C# 如何在保持派生类在内部的同时公开基类,c#,interface,internal,C#,Interface,Internal,您好,我有以下问题: 我有一个结构 public struct Cell { public Node Value; public static implicit Cell(Node value)=>new Cell(value); //can't since node less accesible then cell } 此结构单元包含一个类型为节点的属性,它是一个抽象基类,当前是内部及其所有派生类。我需要的是以某种方式使单元结构可供其他开发人员访问,以便他们可以在不知道节点

您好,我有以下问题:

我有一个结构

public struct Cell
{
   public Node Value;
   public static implicit Cell(Node value)=>new Cell(value); //can't since node less accesible then cell
}
此结构
单元
包含一个类型为
节点
的属性,它是一个抽象基类,当前是
内部
及其所有派生类。我需要的是以某种方式使
单元
结构可供其他开发人员访问,以便他们可以在不知道
节点
派生类

        internal abstract  class Node{
                internal class ANode:Node{
                    public byte[] internalValue;
                }
                internal class BNode:Node{
                    public int internalValue;
                }
         }
我怎样才能做到这一点?
单元
暴露于外部,抽象基类
节点
也应该暴露于外部。用户应该能够从
节点
隐式转换到
单元

当前方法
到目前为止,我尝试的是为
节点
定义一个接口
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()
      {
        .....
      }
    }
上述方法中的问题是,我无法将
IRaw
作为参数传递给
单元格
构造函数,错误代码为:
用户定义的界面转换是不允许的

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

有什么建议吗?我实际上需要在公开的
单元格
和内部的
节点
的内容之间架起一座“桥梁”。

您只需将
节点
公开,并将其派生类保持在内部即可。与此无关,您应该考虑不在嵌套类中派生
节点
,以获得更好的可维护性:

public abstract class Node {
}

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

internal class BNode : Node {
    public int internalValue;
}
如果希望能够从外部程序集创建
阳极
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 };
    }
}

他们如何在不知道
节点
派生类的情况下提取
节点
的值?他们提取一个
字节数组
。每个派生类以自己的方式管理这个
字节
数组的生成。@Bercoviciarian所以基本上
单元格
必须公开一个字节数组?类似于
公共字节[]Value=>node.GetRaw()
?因为是公共的,所以将节点声明为私有的。我认为不能将包含类
public
和嵌套类
internal
。我认为所有层次结构都必须共享访问器。@Bercoviciarian:不,很多设计模式都依赖于这一事实。您不能更改成员可访问性,但可以更改类型可访问性。