diseño de clase de solo lectura cuando ya existe una clase de no solo lectura

Tengo una clase que al construir, carga su información de una base de datos. La información es modificable, y luego el desarrollador puede llamar a Guardar () para que guarde esa información en la base de datos.

También estoy creando una clase que se cargará desde la base de datos, pero no permitirá ninguna actualización. (una versión de solo lectura). Mi pregunta es, ¿debo hacer una clase separada y heredarla, o debo actualizar el objeto existente para que tome un parámetro de solo lectura en el constructor, o debo hacer una clase separada por completo?

La clase existente ya se utiliza en muchos lugares en el código.

Gracias.

Actualizar:

En primer lugar, hay muchas respuestas geniales aquí. Sería difícil aceptar solo uno. Gracias a todos.

Los principales problemas que parece son:

Satisfacer expectativas basadas en nombres de clase y estructuras de herencia.Prevenir código duplicado innecesario

Parece que hay una gran diferencia entre Readable y ReadOnly. Una clase Readonly probablemente no debería ser heredada. Pero una clase de lectura sugiere que también podría ganar capacidad de escritura en algún momento.

Así que después de mucho pensar, esto es lo que estoy pensando:

<code>public class PersonTestClass
{
    public static void Test()
    {

        ModifiablePerson mp = new ModifiablePerson();
        mp.SetName("value");
        ReadOnlyPerson rop = new ReadOnlyPerson();
        rop.GetName();
        //ReadOnlyPerson ropFmp = (ReadOnlyPerson)mp;  // not allowed.
        ReadOnlyPerson ropFmp = (ReadOnlyPerson)(ReadablePerson)mp; 
          // above is allowed at compile time (bad), not at runtime (good).
        ReadablePerson rp = mp;
    }
}

public class ReadablePerson
{
    protected string name;
    public string GetName()
    {
        return name;
    }        
}
public sealed class ReadOnlyPerson : ReadablePerson
{
}
public class ModifiablePerson : ReadablePerson
{
    public void SetName(string value)
    {
        name = value;
    }
}
</code>

Desafortunadamente, todavía no sé cómo hacer esto con propiedades (vea la respuesta de StriplingWarrior para esto hecho con propiedades), pero tengo la sensación de que involucrará la palabra clave protegida ymodificadores de acceso de propiedad asimétricos.

Además, afortunadamente para mí, los datos que se cargan desde la base de datos no tienen que convertirse en objetos de referencia, sino que son tipos simples. Esto significa que realmente no tengo que preocuparme por las personas que modifican a los miembros de laReadOnlyPerson objeto.

Actualización 2:

Tenga en cuenta que, como lo ha sugerido StriplingWarrior, la reducción a la baja puede llevar a problemas, pero esto es generalmente cierto, ya que lanzar un Mono y Animal de nuevo a un Perro puede ser malo. Sin embargo, parece que aunque el lanzamiento está permitido en tiempo de compilación, en realidad no está permitido en tiempo de ejecución.

Una clase de envoltura también puede hacer el truco, pero esto me gusta más porque evita el problema de tener que hacer una copia profunda del objeto pasado / permitir que el objeto pasado se modifique, modificando así la clase envoltura.

Respuestas a la pregunta(5)

Su respuesta a la pregunta