首页 > 解决方案 > 如何在保持派生类内部的同时公开基类

问题描述

你好我有以下问题:

我有一个结构

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用户应该能够隐式转换 from Nodeto Cell

当前方法
到目前为止我尝试的是定义一个接口IRaw,用于从派生类Node中提取内容。显式实现是一个虚拟方法,在派生类中重载。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在构造函数中传递 as 参数,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有什么建议吗?我实际上需要在公开内容和Node内部内容之间建立一个“桥梁” 。

标签: c#interfaceinternal

解决方案


您可以简单地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 };
    }
}

推荐阅读