Подтвердить что ты не робот

Классы класса С# и состав ООП

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

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

Как я могу подойти к этому?

Спасибо.

4b9b3361

Ответ 1

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

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

Ответ 2

Возможно, это может помочь вам.

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));
    }
}

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

class TestMethod{ 
private int Secret;

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

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