OOP дизайн: правильный способ статического указания значения для унаследованного свойства - PullRequest
0 голосов
/ 20 июня 2020

У меня есть 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 может быть установлен динамически.

Каков правильный способ решения этой проблемы ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...