Классы класса С# и состав ООП
Данный класс A, содержащий набор исходных данных и класс B, который содержит реорганизованную версию (GUI ready) этих данных, я хотел бы сделать необработанные данные в видимыми в B.
Очевидно, что исходные данные в классе A содержатся в частных членах. Я хотел бы сделать эти данные видимыми в B, хотя использование чего-то похожего на метод классов друзей С++.
Как я могу подойти к этому?
Спасибо.
Ответы
Ответ 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
.