2010-02-12 13 views
5

Duplicar posibles:
Why use getters and setters?captadores y definidores de uso

Por qué captadores y definidores de uso?

+21

¿Soy yo, o alguien más ve la ironía de que la pregunta fue originalmente etiquetada con su propia respuesta, '[encapsulación]'? –

+2

Lo he devuelto a la pregunta original. Se deben hacer nuevas preguntas con una nueva pregunta, no reemplazándola por una nueva. –

+1

Sorprendentemente, incluso el título del tema de la víctima es exactamente el mismo. Otra evidencia OP no buscó o miró en la lista de "temas relacionados" en absoluto. – BalusC

Respuesta

2

para encapsular.

1

Una razón es para proporcionar una interfaz más uniforme a un objeto en algunos idiomas: ya no tiene que lidiar con la diferencia sintáctica entre campos y métodos; siempre tratas con métodos.

Una segunda razón es que oculta la implementación del objeto, lo que le permite cambiarlo internamente sin afectar a sus clientes. Un ejemplo clásico es uno de coordenadas: si tiene una coordenada representada mediante coordenadas cartesianas, y cambie la representación interna a polar, si usó getters y setters, su programa aún funcionaría aunque los campos xey hayan desaparecido. Esto también le permite usar polimorfismo: dos objetos que representan la misma abstracción, pero cada uno con una implementación diferente de su estado.

Acceder al estado a través de métodos también le permite agregar cosas como la sincronización.

4

para encapsular, y de esa manera se crea cómo se almacenan datos dentro de su clase un detalle aplicación. Si su clase tiene un captador/definidor:

private string _mystring = string.Empty; 
public string SomeValue 
{ 
get 
{ 
    return _mystring; 
} 
} 

Eso le permite cambiar la forma en que administra "SomeValue" en el futuro. Por ejemplo, puede decidir que en lugar de almacenarlo en una cadena, en realidad va a ser un Guid under the hood. Ahora usted podría ir para:

private Guid _myguid= Guid.NewGuid(); 
public string SomeValue 
{ 
get 
{ 
    return _myguid.ToString(); 
} 
} 

cualquier lugar que su clase se utiliza y la propiedad "SomeValue" se accede permanecerá intacta de esta manera.

Validación

También puede validar el valor pasado, así, por lo que en otro ejemplo:

private string _mystring = "My Value"; 
public string SomeValue 
{ 
get 
{ 
    return _mystring; 
} 
set 
{ 
    if (string.IsNullOrEmpty(value)) 
    { 
    throw new InvalidArgumentException(); 
    } 
    else 
    { 
    _myString = value; 
    } 
} 
} 

Para asegurarse de que la cadena almacenada no se establece en un valor nulo/cadena vacía

11

Para limitar el acceso a un estado interno de un objeto.

Considere el ejemplo clásico de una clase de formas geométricas. Diga, un objeto Circle. Cuando se establece el radio, es posible que desee para calcular automáticamente la zona (lo que sería una propiedad de sólo lectura)

class Circle 
{ 
    float radius; 

    public float Radius 
    { 
     get { return radius; } 
     set { radius = value; area = Math.Pi * radius * radius;} 
    } 

    float area; 
    float Area 
    { 
     get { return area;} 
    } 
} 

Si ha permitido el acceso directo al miembro de datos "radio", no se podía actualizar area cuando cambió. Además, si permitía el acceso directo al area, los usuarios podían cambiarlo de cualquier forma sin tener en cuenta radius.

+0

Si hay campos separados para 'radius' y' area', no todas las combinaciones de valores de campo serán válidas. Por otro lado, si se definiera la propiedad 'Area' para calcular y devolver el área del círculo, entonces' Radius' podría reemplazarse con un campo y escribir en él '' cambiaría '' Area' exactamente como debería. . Cuando es práctico, es mejor definir la semántica de una estructura de manera que todas las combinaciones posibles de valores de campo sean válidas, en lugar de diseñar estructuras donde ese no sea el caso. – supercat

2

Si hace que un campo sea privado y configura un getter y un setter para acceder a él, entonces todo el otro código tiene que pasar por esos métodos para obtener esos datos. Entonces, tienes más control.

  • Puede hacer que sea de solo lectura (sin setter).
  • Puede validar la entrada en el setter y rechazarla si no es aceptable.
  • Puede instanciar el objeto solo cuando sea necesario, cuando se invoca por primera vez el captador.
  • Puede cambiar cómo funciona todo más tarde.

Obtiene estos mismos beneficios dentro de la clase, también, si usa estrictamente el captador y el colocador para acceder al campo. Entonces, para muchas personas es algo que hacen todo el tiempo.

Los getters y setters al principio no se ven tan bien porque parecen una gran cantidad de tipeo extra. Pero los IDEs como Eclipse pueden hacer getters y setters automáticamente para usted, si lo desea. Los lenguajes como Objective-C y Ruby también pueden hacer eso, usando sintaxis abreviada. C# puede envolver getters y setters en "propiedades", que se usan en el código como campos, pero bajo el capó llama al getter y al setter que escribes.

Por lo tanto, hay muchas razones para usar getters y setters, y muchas facilidades para hacerlo menos doloroso.

+0

¡Respuesta fabuloso además de que no tenía idea de que las propiedades estuvieran en C# antes de Obj-C! – cheznead

Cuestiones relacionadas