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



你好,我有以下问题:

我有一个结构

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及其所有派生类。我需要的是以某种方式使其他开发人员可以访问Cell结构,这样他们就可以在不知道Node派生类的情况下提取Node的值。

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

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

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

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构造函数,错误代码为:CCD_ 16。

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

有什么建议吗?实际上,我需要在公共的Cell和内部的Node内容之间建立一座"桥梁"。

您可以简单地将Node公开,并将其派生类保留在内部。与此无关,您应该考虑不在嵌套类中派生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 };
}
}

最新更新