2010-02-01 3 views
12

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

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

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

спасибо.

ответ

10

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

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

+1

'internal' + свойства = безопасно. –

+0

Это похоже на случай * внутренних свойств * или, возможно, * внутреннего интерфейса *, который реализует исходный класс данных A, который позволяет B получить доступ к некоторым частным членам без чрезмерной привязки к A. – LBushkin

+1

@LBushkin: внутренний интерфейс безусловно, является решением, но он кажется лишним, если на самом деле не будет более одного класса, реализующего его. –

1

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

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

0

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

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

0

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

class TestMethod{ 
private int Secret; 

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

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

7

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

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

Это умный способ реализации семантики 'friend'.Я не всегда использую 'friend', но когда я это делаю, я использую этот шаблон доступа :-) –

+1

Но это просто нарушает безопасность компиляции. Я мог бы использовать любой класс для 'AccessData' здесь, и компилятор не стал бы жаловаться. –

Смежные вопросы