В экспериментальных целях я пытаюсь создать библиотеку бинарного дерева поиска, из которой может быть создан экземпляр BST для хранения либо уникальных, либо избыточных узлов (с избыточным узлом, являющимся одним со значением, эквивалентным другому в дереве),Для возможности повторного использования я определил один универсальный интерфейс, ITree и два подчиненных интерфейса: IUnique и IRedundant.
Причина моего ответа на Явная реализация интерфейса C # интерфейсов, которые наследуются от других интерфейсов, код библиотеки может быть продемонстрирован следующим образом [Имя файла: 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 [Имя файла: 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]
Чтобы поддерживать модульность, как я могу хранить библиотеку отдельно от логики моего приложения?
EDIT (11 января 2010 г.): Да, это была ошибка в Mono 2.8.x, и она была исправлена в версии 2.10.