projekt klasy tylko do odczytu, gdy klasa nie-readonly jest już na miejscu

Mam klasę, która po zbudowaniu ładuje informacje z bazy danych. Informacje są modyfikowalne, a następnie programista może wywołać w nim Save (), aby zapisać te informacje z powrotem do bazy danych.

Tworzę także klasę, która ładuje się z bazy danych, ale nie zezwala na żadne aktualizacje. (wersja tylko do odczytu.) Moje pytanie brzmi: czy powinienem utworzyć oddzielną klasę i dziedziczyć, czy też powinienem zaktualizować istniejący obiekt, aby w konstruktorze pobrać parametr tylko do odczytu, czy też powinienem utworzyć osobną klasę w całości?

Istniejąca klasa jest już używana w wielu miejscach kodu.

Dzięki.

Aktualizacja:

Po pierwsze, jest tu wiele świetnych odpowiedzi. Trudno byłoby zaakceptować tylko jedną. Dziękuję wszystkim.

Główne problemy wydają się:

Spełnianie oczekiwań w oparciu o nazwy klas i struktury dziedziczenia.Zapobieganie niepotrzebnemu duplikatowi kodu

Wydaje się, że istnieje duża różnica między Readable i ReadOnly. Klasa Readonly prawdopodobnie nie powinna być dziedziczona. Ale klasa czytelna sugeruje, że w pewnym momencie może również zyskać zdolność zapisu.

Więc po wielu przemyśleniach oto, o czym myślę:

<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>

Niestety, nie wiem jeszcze, jak to zrobić za pomocą właściwości (patrz odpowiedź StriplingWarrior na to, co zostało zrobione z właściwościami), ale mam wrażenie, że będzie to dotyczyło chronionego słowa kluczowego iasymetryczne modyfikatory dostępu do własności.

Na szczęście dla mnie dane, które są ładowane z bazy danych, nie muszą być przekształcane w obiekty referencyjne, są to raczej typy proste. Oznacza to, że tak naprawdę nie muszę się martwić o ludzi modyfikujących członkówReadOnlyPerson obiekt.

Aktualizacja 2:

Zauważ, jak zasugerował StriplingWarrior, downcasting może prowadzić do problemów, ale jest to na ogół prawdą, ponieważ rzucenie Małpy na i Zwierzę z powrotem na Psa może być złe. Wydaje się jednak, że mimo że casting jest dozwolony w czasie kompilacji, nie jest on faktycznie dozwolony w czasie wykonywania.

Klasa opakowująca może również załatwić sprawę, ale podoba mi się to lepiej, ponieważ pozwala uniknąć problemu głębokiego kopiowania przekazanego obiektu / umożliwia modyfikację przekazanego obiektu, modyfikując tym samym klasę opakowania.

questionAnswers(5)

yourAnswerToTheQuestion