Я реализую структуру данных union-find в C #. Элементы должны расширять внутренний класс Element, но я бы хотел оставить поля в этом классе приватными для внешнего мира. Однако они должны быть открытыми для прямого внешнего класса. Следующий код не компилируется из-за «несовместимой доступности»:
class DisjointSetForrests<T> where T : DisjointSetForrests<T>.Element {
private class PrivateElement {
public Element p;
public int rank;
}
public class Element : PrivateElement {
}
public void MakeSet(T x) {
x.p = x;
x.rank = 0;
}
public T FindSet(T x) {
if (x != x.p) x.p = FindSet(x);
return (T)x.p;
}
public void Union(T x, T y) {
Link(FindSet(x), FindSet(y));
}
public void Link(T x, T y) {
if (x.rank > y.rank) {
y.p = x;
} else {
x.p = y;
if (x.rank == y.rank) y.rank++;
}
}
}
Есть ли способ достичь того, чего я хочу, или я должен признать поля в Элементе общедоступными?