Pregunta

Estoy interesado en hacer una clase inmutable que tiene propiedades que no se pueden modificar, y una clase mutable que se deriva de ella. Estos objetos serían objetos de datos simples que representan los registros de base de datos, por lo que tendrían que sólo los valores inmutables de las propiedades.

Mi objetivo es tener mi capa de acceso de datos a crear las versiones de los objetos mutables normalmente, estableciendo las propiedades en base a los valores de base de datos, pero al pasar las versiones de sólo lectura de estos objetos a la aplicación. (Estoy bien con el hecho de que el código se podría convertir explícitamente el objeto inmutable de nuevo en un ser mutable si el desarrollador de verdad quería.)

Puedo hacer esto uglily (es que una palabra?), Usando métodos de captadores y definidores y tener un nuevo colocador pública para la clase mutable:

public class ImmutableClient {
    private int _clientId;
    public int getClientId() { return _clientId; }
    protected void setClientId(int clientId) { _clientId = clientId; }
}

public class Client : ImmutableClient {
    public new void setClientId(int clientId) { base.setClientId(clientId); }
}

Yo prefiero usar auto-propiedades, si es posible - que son mucho más agradable al depurar. Aparte de eso, no me importa cómo se ve el código, ya que sólo va a venir de todo un generador de código y nunca ser mirado.

¿Alguna idea?

¿Fue útil?

Solución

Me gustaría utilizar una interfaz. Tener una única interfaz de lectura que se devuelve al cliente y una clase totalmente grabable que lo implementa, pero sólo se utiliza en la capa de acceso a datos.

interface IReadOnlyObject
{
    int Property { get; }
}

class DALObject : IReadOnlyObject
{
    public int Property { get; set; }
}

Otros consejos

Usted puede tener su capa de datos devuelve una interfaz de sólo lectura:

interface IClient
{
     int getClientId();
}

A continuación, usted no necesita preocuparse si su aplicación concreta tiene una incubadora o no -. Las personas que llaman sólo se utilizarán el captador

Como nota al margen - el código se parece más a Java a C #, así que usaría en realidad:

interface IClient
{
     int ClientId { get; }
}

Inmutable significa inmutable. Cuando veo que un tipo es inmutable, sé que puedo almacenar en caché y operar sobre ella varias veces sin que nunca cambia. estado mutable hace que el valor supuesto.

class Foo
{
    // I'm immutable
}

class Bar : Foo
{
    // I add mutable properties
}

...

void F(Foo foo)
{
    // foo is immutable - therefore Bar (mutable) *cannot* be derived from Foo.
}

Tener una clase base que proporciona no mutators pero no proporciona ninguna promesa de la inmutabilidad. Tener una clase derivada inmutable y mutable una clase separada de origen. Todas las clases deben tener un constructor que acepte la clase base, y un sobrecargado propiedad sobrecargable / "AsImmutable" que devolverá un objeto de la clase inmutable derivada, o bien llamando al constructor o (si el objeto ya es de la clase inmutable) regresa sí mismo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top