2010-02-01 17 views
12

Dada la clase A, que contiene conjuntos de datos brutos, y la clase B, que contiene una versión reorganizada (GUI ready) de esos datos, me gustaría que los datos brutos en A sean visibles en B.C# Friend classes y OOP Composition

Claramente, los datos brutos en la clase A están contenidos en miembros privados. Me gustaría hacer que los datos sean visibles en B aunque el uso de algo similar al método de clases de amigos de C++.

¿Cómo puedo abordar esto?

Gracias.

Respuesta

10

Estrictamente hablando, no puede definir una clase específica (o una lista de clases) a la que pueda exponer los datos. Sin embargo, puede utilizar el modificador de acceso internal en lugar de private, lo que hace que los miembros estén disponibles para cualquier clase en el mismo ensamblaje.

Dicho esto, debe fuertemente considerar exponer a estos miembros a través de propiedades en lugar de campos (que es lo que supongo que está planeando exponer). Hacer esto permitirá que la clase defina exactamente cómo se puede exponer esa información a otras clases y qué, en todo caso, debería ocurrir cuando otra clase cambie los datos.

+1

'internal' + = propiedades segura. –

+0

Esto parece ser un caso de * propiedades internas * o posiblemente una * interfaz interna * que implementa la clase de datos de origen A que permite a B acceder a algunos de los miembros privados sin estar excesivamente atados a A. – LBushkin

+1

@LBushkin: una interfaz interna es ciertamente una solución, pero parece innecesaria a menos que realmente haya más de una clase implementándola. –

1

Puede definir ambos en un conjunto y marcar los campos en A como "internos".

Un enfoque más OO es proporcionar un conjunto de métodos públicos en A que permiten el acceso a los datos (o un subconjunto de los datos), normalmente a través de propiedades simples.

0

Dependiendo de su estructura, es posible que pueda utilizar clases parciales. Esto significaría que los datos y la interfaz de usuario están en realidad dentro de la misma clase, pero los tiene dentro de archivos diferentes.

Si eso no funciona para usted, entonces tiene variables de ámbito interno como alternativa o funciona con conjuntos de datos que la interfaz de usuario representa de una manera más genérica.

0

El método antiguo (nunca mejor dicho) sería definir sencilla getValue() y FijarValor() funciones para devolver ese valor para que estos valores se vuelven inaccesibles sin el uso de estas funciones, en C# estas funciones son miembros predefinidos llamados propiedades.

class TestMethod{ 
private int Secret; 

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

El otro método es que, como otros han dicho antes que yo, sólo tiene que utilizar el modificador internal.

7

Puede ser que esto podría ayudarle ..

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

Esta es una manera inteligente de implementar la semántica de 'amigo'.No siempre uso 'friend', pero cuando lo hago, utilizo este patrón de acceso :-) –

+1

Pero esto solo rompe la seguridad del tiempo de compilación. Casi podría usar cualquier clase para 'AccessData' aquí y el compilador no se quejaría. –