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