Задать вопрос
Ответы пользователя по тегу Полиморфизм
  • Можно ли в классе-потомке переопределить метод с новыми параметрами?

    Это противоречит LSP.

    Вот представьте, вам дали такую возможность и вы переопределили метод с новыми параметрами. Теперь у нас есть метод, который принимает Layer или даже ICreatable. Допустим так:

    void DoSomething (ICreatable layer) {
      layer.Create();
    }


    Но мы ведь можем передать потомка в этот метод! Делаем следующее и ломаем наш код:
    DoSomething(new PerlinNoiseLayer())

    Потому именно в таком виде - нет, нельзя.

    Для генерации каждого слоя нужен разный набор параметров и генерируются они, соответственно, по-разному
    Ну вот у вас есть разница - вот и отобразите её в своем коде.

    Это слой? - Да. - Ок, тогда посмотрим его высоты.
    Если есть такая необходимость - почему бы не ввести отдельный интерфейс для высот?

    void DoSomething (IHasHeights layer) {
      layer.Heights; // <== тут есть высоты
    }


    Почему бы не воспользоваться фабрикой или билдером? Или даже заставить передавать все эти параметры в конструктор?

    public abstract class Layer: ICreatable
    {
        float[,] Heights { get; set; }
        public abstract void Create();
    }
    
    public class PerlinNoiseLayer : Layer
    {
        private float[,] _heights;
        readonly int _resolution ;
    
        public PerlinNoiseLayer (int resolution) {
            _resolution = resolution;
        }
    
        public override void Create()
        {
            // тут расширение уже есть
        }
    }
    Ответ написан
    6 комментариев