полу-частный внутренний класс - PullRequest
0 голосов
/ 20 января 2012

Я реализую структуру данных 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++;
        }
    }
}

Есть ли способ достичь того, чего я хочу, или я должен признать поля в Элементе общедоступными?

1 Ответ

1 голос
/ 20 января 2012

Невозможно держать их открытыми только для внешнего класса. Вопрос в том, зачем вам их держать публичными? Если вы создаете библиотеку, вы можете использовать internal.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...