c# - 如何在保持派生类内部的同时公开基类
问题描述
你好我有以下问题:
我有一个结构
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 Node
to 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
内部内容之间建立一个“桥梁” 。
解决方案
您可以简单地Node
公开并将其派生类保留在内部。与此无关,您应该考虑不要Node
在嵌套类中派生以获得更好的可维护性:
public abstract class Node {
}
internal class ANode : Node {
public byte[] internalValue;
}
internal class BNode : Node {
public int internalValue;
}
如果您希望能够从外部程序集创建实例ANode
,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 };
}
}
推荐阅读
- java - 按列对二维整数数组进行排序
- mod-rewrite - 为什么这个 RewriteRule 需要标志 [L]
- sum - 如果存在未达到阈值的公开单元格值,则 PowerBI Veil 总计
- php - Laravel 显示来自本地存储的文件,Web Route 的问题
- c - 无法构建emergent
- python - 如何将组合组的箱线图添加到 Seaborn 的分组箱线图中?
- c - C程序 - 左截断素数
- docker - docker 容器可以在其他 docker 容器中运行吗?
- reactjs - Semantic-ui-react 模式不起作用,打字稿错误
- powershell - 如何创建提示输入的 Exchange shell 脚本