2010-05-09 27 views
8
Class Outer 
{ 
... 
    private class Node 
    { 
     private T data; 
     ... 

     private T getData() 
     { 
     return data; 
     } 
    } 
} 

¿Cuál es el propósito de usar los métodos de establecer y obtener si la clase externa puede acceder a los miembros privados de la clase interna? ¿Cuál es el propósito de hacer privadas las clases internas? ¿Acceso al paquete?Clase que accede a partes internas de clase interna?

+1

Por favor, marque la pregunta con el idioma que está utilizando. –

+0

@Donal, parece Java. –

+0

Donal, esta es una pregunta bastante independiente del lenguaje ... más una pregunta general de OO. – Polaris878

Respuesta

8

Las clases internas privadas se escriben cuando no desea que la clase esté expuesta a clases externas dentro o fuera del paquete. Se usan solo dentro de la clase de nivel externo.

Los getters y setters generalmente no tienen sentido dentro de una clase privada porque de todos modos se puede acceder a las variables de instancia.

4

Usted podría omitir getters y setters triviales, pero a menudo esos métodos no son triviales (un caso común es el patrón de 'carga lenta').

Editado para agregar: La carga lenta es cuando solo se crea una instancia de un miembro cuando se solicitan los datos. Se usa cuando obtener los datos no siempre es necesario y es costoso de obtener.

class a 
{ 
private: 
    int m_aNumber; 
    bigDeal *m_pBig; 

public: 
    a() { m_aNumber = 0; m_pBig = NULL; } 
    ~a() { if (m_pBig) delete m_pBig; } 

    // trivial 
    int get_aNumber() { return m_aNumber;} 
    void set_aNumber(int val) { m_aNumber = val; } 

    // lazy load 
    bigDeal *get_Big() 
    { 
     if (m_pBig == NULL) 
     { 
      // bigDeal::bigDeal() downloads data from Mars Rover 
      // takes 20 minutes, costs $1.2 million dollars to run 
      m_pBig = new(bigDeal); 
     } 
     return m_pBig; 
    } 
    void set_Big(bigDeal *val) 
    { 
     m_pBig = val; 
    } 
} 
+0

¿Puedes exponer sobre esto? – ShrimpCrackers

+0

Um, downvotes? Hay un error? Preguntó por 'carga floja' ... – egrunin

1

En primer lugar, yo diría que para tratar las clases internas public/protected/internal de la misma manera que trataría cualquier otra clase "externa". Es decir, use los mismos principios de diseño.

En cuanto a las clases internas, cuando estoy usando clases privadas generalmente terminan siendo un montón de bytes ... lo que significa que no hacen el procesamiento real. Están allí para facilitar la escritura del código para la clase externa.

No te estoy diciendo que escribas un código incorrecto, pero puedes ser mucho más laxo en tu diseño con clases privadas internas. Como regla general, deben ser simplistas y livianos ... no te pases con OO en las clases internas. Además, si terminas teniendo que cambiar algo en la clase interna, solo tendrás que actualizar las referencias en la clase externa ... que TBH no es un gran problema.