У меня есть OOP вопрос о дизайне, который, вероятно, довольно прост. Мне не удалось найти ответ на свой вопрос через Google, но я думаю, что это скорее следствие того, что я не могу правильно сформулировать свои ключевые слова - надеюсь, кто-то может указать мне правильное направление. На самом деле вопрос относится к большему проекту, но я упрощу его до минимума.
class Animal
{
private string sound;
public getSound()
{
return this.sound;
}
public setSound(string newSound)
{
this.sound = newSound;
}
}
У меня есть класс Animal
со свойством private sound
и сопутствующей парой получателей / установщиков. Как мне разработать класс Dog
, который наследуется от Animal
, чтобы он определял свойство sound
как "bark"
и, что особенно важно, предотвращал его изменение ?
Вот два варианта, о которых я мог подумать:
A) Установить свойство статически и удалить / скрыть установщик, например:
class Dog : Animal
{
public Dog()
{
this.sound = "bark";
}
// Hide this
private setSound(string newSound)
{
this.sound = newSound;
}
}
Ни один язык, который я знаю, не позволяет это, потому что он ломает Лисков.
Б) Установщик перегрузки ничего не делает или генерирует исключение:
class Dog : Animal
{
public Dog()
{
this.sound = "bark";
}
// Either
public setSound(string newSound)
{
}
// Or
public setSound(string newSound)
{
throw new InvalidOperation("Dogs can't not bark");
}
}
Первый - запах кода, и оба снова ломают Лисков.
Некоторый контекст: Фактическая проблема заключается в наличии иерархии классов, которая генерирует код, в частности, вложенные массивы в PHP, например $myArr = ['a'=> ..., 'b' => ...]
. В этом конкретном примере у меня будет класс, представляющий $myArr
, который будет иметь поля $a
и $b
, с геттерами / сеттерами для обоих (я немного упрощаю ради краткости). Что мне нужно, так это возможность создать $mySpecificArr
, где, например, $a
будет статически установлен на некоторое значение, и только $b
может быть установлен динамически.
Каков правильный способ решения этой проблемы ?