C # Классы друга и композиция Оп
-
24-09-2019 - |
Вопрос
Учитывая класс A, который содержит наборы необработанных данных, а класс B, который содержит реорганизованную версию (GUI готово) этих данных, которые я хотел бы сделать необработанные данные в видимом в B.
Очевидно, что необработанные данные в классе A содержатся в частных членах. Я хотел бы сделать эти данные, видимые в B, хотя использование чего-то похожего на метод классов друзей C ++.
Как я могу подойти к этому?
Спасибо.
Решение
Строго говоря, вы не можете определить определенный класс (или список классов), которые вы можете разоблачить данные. Вы можете, однако, использовать internal
модификатор доступа вместо private
, что делает члены доступными для любого класса в той же сборке.
Что говорится, вы должны сильно Подумайте о том, чтобы разоблачить этих членов через свойства, а не поля (что в том, что я предполагаю, что вы планируете разоблачить). Это позволит классу определить именно то, как эта информация может подвергаться воздействию других классов и что-то - если что-то - должно произойти, когда другой класс меняет данные.
Другие советы
Может быть, это может помочь вам ..
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));
}
}
Вы можете определить как на сборке, так и отмечать поля в «внутреннем».
Более более подход OO состоит в том, чтобы обеспечить набор публичных методов в A, который позволяет доступ к данным (или подмножению данных), как правило, через простые свойства.
В зависимости от вашей структуры, вы можете использовать частичные классы. Это означало бы, что данные и интерфейс на самом деле находятся как в одном классе, но у вас есть их в разных файлах.
Если это не сработает для вас, то у вас есть внутренние определенные переменные в качестве альтернативы или работают с наборами наборах, которые пользовательский интерфейс представляет более общей способ.
Старый метод (каламбур) будет определить просто GetValue () а также SetValue () Функции для возврата этого значения, чтобы эти значения станут недоступными без использования этих функций, в C # эти функции представляют собой предопределенные элементы, называемые свойствами.
class TestMethod{
private int Secret;
get { return Secret;}
set { Secret = value;}
}
Другой метод заключается в том, что, поскольку другие заявили до меня, просто используйте internal
модификатор.