schreibgeschütztes Klassendesign, wenn bereits eine nicht schreibgeschützte Klasse vorhanden ist

Ich habe eine Klasse, die beim Erstellen Informationen aus einer Datenbank lädt. Die Informationen können alle geändert werden. Anschließend kann der Entwickler Save () aufrufen, um sie in die Datenbank zurückzuspeichern.

Ich erstelle auch eine Klasse, die aus der Datenbank geladen wird, aber keine Aktualisierungen zulässt. (Eine schreibgeschützte Version.) Meine Frage ist, sollte ich eine separate Klasse erstellen und erben, oder sollte ich einfach das vorhandene Objekt aktualisieren, um einen schreibgeschützten Parameter im Konstruktor zu übernehmen, oder sollte ich eine separate Klasse vollständig erstellen?

Die vorhandene Klasse wird bereits an vielen Stellen im Code verwendet.

Vielen Dank.

Aktualisieren:

Erstens gibt es hier viele gute Antworten. Es wäre schwer, nur einen zu akzeptieren. Vielen Dank an alle.

Die Hauptprobleme scheinen zu sein:

Erfüllen von Erwartungen basierend auf Klassennamen und Vererbungsstrukturen.Vermeiden Sie unnötigen doppelten Code

Es scheint einen großen Unterschied zwischen Readable und ReadOnly zu geben. Eine Readonly-Klasse sollte wahrscheinlich nicht vererbt werden. Eine Readable-Klasse deutet jedoch darauf hin, dass sie möglicherweise irgendwann auch wieder beschreibbar wird.

Nach langen Überlegungen überlege ich mir Folgendes:

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

Leider weiß ich noch nicht, wie man dies mit Eigenschaften macht (siehe die Antwort von StriplingWarrior für diese mit Eigenschaften), aber ich habe das Gefühl, dass es sich um das geschützte Schlüsselwort und handeltasymmetrische Eigenschaftszugriffsmodifikatoren.

Zum Glück müssen die aus der Datenbank geladenen Daten nicht in Referenzobjekte umgewandelt werden, sondern es handelt sich um einfache Typen. Das heißt, ich muss mich nicht wirklich darum kümmern, dass Leute die Mitglieder der ändernReadOnlyPerson Objekt.

Update 2:

Beachten Sie, wie StriplingWarrior angedeutet hat, dass Downcasting zu Problemen führen kann. Dies gilt jedoch im Allgemeinen, da es schlecht sein kann, einen Affen und ein Tier zurück zu einem Hund zu werfen. Es scheint jedoch, dass das Casting zur Kompilierungszeit zwar zulässig, zur Laufzeit jedoch nicht zulässig ist.

Eine Wrapper-Klasse kann auch den Trick ausführen, aber das gefällt mir besser, weil es das Problem vermeidet, das übergebene Objekt tief zu kopieren / das übergebene Objekt modifizieren zu lassen, wodurch die Wrapper-Klasse modifiziert wird.

Antworten auf die Frage(5)

Ihre Antwort auf die Frage