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

时间:2018-07-13 10:22:50

标签: 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
}

此结构Cell包含类型为Node的属性,该属性为抽象基类,当前为internal及其所有派生类。我需要以某种方式使{{ 1}}结构可用于其他开发人员,以便他们可以提取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定义一个接口IRaw,该接口从Node派生类中提取内容。显式实现是一个虚拟方法,在派生类中重载了。 / p>

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

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内容之间建立一个“桥梁”。

1 个答案:

答案 0 :(得分:3)

您只需公开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 };
    }
}