C # Friend классы и ООП Композиция - PullRequest
12 голосов
/ 01 февраля 2010

Учитывая класс A, который содержит наборы необработанных данных, и класс B, который содержит реорганизованную версию (готовую к графическому интерфейсу) этих данных, я хотел бы сделать необработанные данные в A видимыми в B.

Очевидно, что необработанные данные в классе A содержатся в закрытых членах. Я хотел бы сделать эти данные видимыми в B, используя что-то похожее на метод классов C ++.

Как мне подойти к этому?

Спасибо.

Ответы [ 5 ]

10 голосов
/ 01 февраля 2010

Строго говоря, вы не можете определить конкретный класс (или список классов), которому вы можете предоставить данные. Однако вместо private можно использовать модификатор доступа internal, что делает члены доступными для любого класса в той же сборке.

При этом вам следует решительно рассмотреть возможность предоставления этих членов с помощью свойств, а не полей (что, как я предполагаю, вы планируете выставлять) Это позволит классу точно определить, как эта информация может быть представлена ​​другим классам, и что - если что-то - должно произойти, когда другой класс изменяет данные.

7 голосов
/ 16 марта 2010

Может быть, это может помочь вам ..

public class A
{
    public A() { }

    public string AccessData(object accessor)
    {
        if (accessor is B)
            return "private_data";
        else
            throw new UnauthorizedAccessException();
    }
}

public class B
{
    public B() { }

    private void AccessDataFromA()
    {
        Console.WriteLine(new A().AccessData(this));
    }
}
1 голос
/ 01 февраля 2010

Вы можете определить как в сборке, так и пометить поля в A как "внутренние".

Более подход OO заключается в предоставлении набора открытых методов в A, которые обеспечивают доступ к данным (или подмножеству данных), обычно через простые свойства.

0 голосов
/ 16 марта 2010

Старый метод (предназначенный для каламбура) заключался в определении простых функций getvalue () и setvalue () для возврата этого значения, чтобы эти значения стали недоступными без использования эти функции, в C # эти функции являются предопределенными членами, называемыми свойствами.

class TestMethod{ 
private int Secret;

get { return Secret;}
set { Secret = value;}
}

Другой метод заключается в том, чтобы, как другие говорили до меня, просто использовать модификатор internal.

0 голосов
/ 01 февраля 2010

В зависимости от вашей структуры вы можете использовать частичные классы.Это будет означать, что Data и UI на самом деле находятся в одном и том же классе, но у вас есть они в разных файлах.

Если это не работает для вас, то у вас есть внутренние переменные области в качестве альтернативыили работа с наборами данных, которые пользовательский интерфейс представляет в более общем виде.

...