出于实验目的,我试图构建一个二进制搜索树库,从中可以实例化BST以保存唯一的或冗余的节点(冗余节点是一个值与树中另一个相等的值) 。为了可重用,我定义了一个通用接口,ITree和两个子接口:IUnique和IRedundant。
作为我回复Explicit C# interface implementation of interfaces that inherit from other interfaces的原因,库代码可能如下所示[文件名: itest.cs ]:
namespace MyNS {
public interface INode<T,N>
where N : INode<T,N> {
N LChild { get; set; }
N RChild { get; set; }
T Value { get; set; }
}
public interface ITree<T,N,I>
where N : INode<T,N>
where I : ITree<T,N,I> {
void Add(N node);
}
public interface IUnique<T,N>
: ITree<T,N,IUnique<T,N>>
where N : INode<T,N> {
}
public interface IRedundant<T,N>
: ITree<T,N,IRedundant<T,N>>
where N : INode<T,N> {
}
public class Node<T>
: INode<T,Node<T>> {
public Node<T> LChild { get; set; }
public Node<T> RChild { get; set; }
public T Value { get; set; }
}
public class Tree<T>
: IUnique<T,Node<T>>,
IRedundant<T,Node<T>> {
void ITree<T,Node<T>,IUnique<T,Node<T>>>.Add(Node<T> node) {
/// Add node only if there is none with an equivalent value ///
}
void ITree<T,Node<T>,IRedundant<T,Node<T>>>.Add(Node<T> node) {
/// Add node regardless of its redundancy ///
}
}
}
示例主要方法[文件名: main.cs ]:
public class ITest {
public static void Main() {
System.Console.WriteLine(typeof(MyNS.Tree<int>));
}
}
尝试将库编译为与主可执行文件分开的程序集会导致以下错误:
$ mcs -out:itest.dll -t:library itest.cs
$ mcs -out:itest.exe main.cs -reference:itest
error CS0011: Could not load type 'MyNS.ITree`3[T,N,MyNS.IUnique`2[T,N]]' from assembly 'itest, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null'.
Compilation failed: 1 error(s), 0 warnings
但是,将两者合并在一起的工作方式完全符合预期:
$ mcs -out:itest.exe main.cs itest.cs
$ mono itest.exe
MyNS.Tree`1[System.Int32]
为了保持模块化,我如何将库与应用程序逻辑分开?
编辑(2010年1月11日):是的,它是Mono 2.8.x的一个错误,并已在2.10版中修复。
答案 0 :(得分:2)
我不熟悉单声道编译器,所以我不能告诉你正确的语法,但我认为更简单的答案是你的第二个库没有正确引用迭代库。他们正确地编译在一起证明你的代码是正确的。
我认为你有99%的方式......只需仔细检查你的参考语法。