@Ksushqa
Unity developer

Можно ли в классе-потомке переопределить метод с новыми параметрами?

Добрый день!
Пытаюсь разобраться с тонкостями ООП. Простой пример.
Есть абстрактный класс Слой:
public abstract class Layer: ICreatable
{
    float[,] Heights { get; set; }
    public abstract void Create();
}

Интерфейс, который он реализует, тоже прост:
interface ICreatable
{
    void Create();
}


Я хочу создать класс-потомок, который будет являться определенным типом слоя. Не понимаю, можно ли в нем реализацию метода Create() переписать как метод Create(int someParameter)? Если нет, то как лучше реализовать мою задумку. Я хочу, чтобы каждый тип слоя (класс-потомок) был ICreatable.

Чтобы было что-то типа такого:
public class PerlinNoiseLayer : Layer
{
    private float[,] _heights;

    public override void Create(int resolution)
    {
        ...
    }
}
  • Вопрос задан
  • 249 просмотров
Решения вопроса 1
Это противоречит 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()
    {
        // тут расширение уже есть
    }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы