Справка по объектно-ориентированному проектированию с C ++ на C # - PullRequest
1 голос
/ 20 ноября 2008

Эй, я обычно сталкиваюсь с ситуацией, когда создаю класс, экземпляром которого должен быть только один или несколько классов. В этом случае я бы сделал его конструктор закрытым и сделал его классом-другом для объектов, которые должны иметь возможность его создания. Например (в C ++):

class CFoo
{
    friend class CFoo;

    // private ctor because only a select few classes should instantiate
    private:
    CFoo()
    {
        ... Do stuff
    }
}

class CBar
{
    // CBar is one of the few classes that only need to use CFoo

    CFoo *m_pFoo;

    CBar()
    {
        m_pFoo = new CFoo;
    }
}

Итак, мой вопрос: это глупо? Или есть лучший способ добиться этого? Мне особенно интересно, как он будет работать с C #, учитывая, что в языке полностью отсутствует ключевое слово friend. Спасибо.

Ответы [ 7 ]

2 голосов
/ 20 ноября 2008

Цель здесь заключается в том, что у вас не может быть CFoo, пока у вас нет рабочего CBar.

Этого можно добиться и в C #, если у вас есть собственный конструктор для CFoo, а затем создать статический метод в CFoo, который принимает аргумент CBar, вызывает указанный конструктор и возвращает новый CFoo.

Это будет что-то вроде метода System.Drawing.Graphics.FromImage (Image image).

Вопрос о том, почему в C # отсутствует ключевое слово friend, был рассмотрен в другом месте .

1 голос
/ 20 ноября 2008

Вы можете посмотреть на маркировку CFoo внутреннюю

internal class CFoo
  • это может удовлетворить ваши потребности. Как сказал @g, вы можете вкладывать классы в классы, но это немного пахнет ИМХО.
1 голос
/ 20 ноября 2008

В C # в зависимости от того, как используется класс, вы можете определить один класс в области действия другого.

public class CBar
{
    CBar()
    {
        m_pFoo = new CFoo();
    }

    CFoo m_pFoo;

    private class CFoo
    {
        CFoo()
        {
            // Do stuff
        }
    }
}
0 голосов
/ 20 ноября 2008

Просто сделайте урок приватным. Это просто ограничивает область применения вашей dll (exe и т. Д.). Нет ничего более крутого, чем объявление друга в C #, но Марчин прав в том, что вам следует пересмотреть такие конструкции. Если вам действительно нужна поддержка «друга», вы можете использовать отражение для симуляции во время выполнения.

0 голосов
/ 20 ноября 2008

Во-первых, объявление друга находится в неправильном классе. CFoo нужен другу CBar, чтобы предоставить CBar доступ к своим частным пользователям.

Во-вторых, да, как правило, этого следует избегать. Классы должны редко заботиться о том, как / где они используются. Если они это сделают, то эта функциональность, вероятно, должна быть нарушена по-другому.

0 голосов
/ 20 ноября 2008

Чтобы помочь подумать, глупо это или нет, не могли бы вы привести более конкретный пример того, что такое классы?

Я бы сказал, что использование друга без уважительной причины звучит немного странно для меня ... в C # у вас есть такая вещь, как ассемблер, поэтому вы можете использовать внутренний конструктор или приватный конструктор и несколько статических методов создания. с разным доступом (защищенный, публичный, внутренний ...)

0 голосов
/ 20 ноября 2008

Тот факт, что CFoo используют только несколько определенных классов, не означает, что вы должны явно блокировать его использование другими. Если это действительно необходимо, вы можете переосмыслить свой дизайн. Вы определенно не хотите использовать такое большое количество связей в своем коде. Позаботьтесь о том, чтобы объяснить, почему вы это делаете, поэтому мы можем лучше предложить хорошее решение?

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