Лучший способ доступа к родительским свойствам из дочернего класса

Вопрос:

Я работаю над редактором плит. В редакторе вы можете загрузить карту плитки. Каждая карта плитки может иметь несколько слоев. На карте плитки есть список ее слоев. Теперь мне нужны свойства карты плитки в классе слоев (например, ширина/высота плитки, например). Теперь я спрашиваю себя, как лучше всего это сделать.

  1. Я мог бы сделать двунаправленные отношения, введя свойство tilemap в классе слоев, чтобы у меня был доступ ко всему, что мне нужно оттуда. Но тогда мне придется позаботиться о двух сторонах отношений.

  2. Я мог бы предоставить все необходимые свойства классу слоя с помощью конструктора, но затем они в основном стали свойствами слоя (они же разные объекты для каждого слоя).

  3. То же, что и 2, но дайте свойства слою с параметром ref.

  4. Я мог бы создать класс, называемый как TileMapLayerProperties, где я помещаю все свойства, а затем передаю объект классам слоев. Преимущество заключалось бы в том, что все свойства будут одинаковыми, и для экземпляра будет только ссылка tileMapLayerProperties. Другим преимуществом было бы «определение» конструктора слоя, которое становилось бы намного короче.

Поэтому любые предложения/советы будут оценены.

Лучший ответ:

Двунаправленная ассоциация (1) может быть ОК или нет, в зависимости от того, какие свойства и методы содержит карта плитки и что слой должен знать и получать доступ. Если на карте плитки есть метод DeleteAllLayers и слои не должны ее вызывать, тогда слои не могут иметь прямой доступ к их родителям.

Создание выделенного объекта свойства (4) кажется мне более чистым. Таким образом, у вас есть один объект со всей необходимой информацией, которую вы можете обойти, но он не содержит более того, особенно это не позволяет вызывать деструктивные методы и т.д.

Передача свойств конструктору (2) аналогична (4), но более многословной и менее объектно-ориентированной. Это прекрасно, когда у вас есть 1 или 2 свойства, но с более чем небольшим количеством становится уродливым и неподъемным.

Но есть и другая проблема: если свойства имеют неизменяемые типы (например, int, string), то слои не видят изменений, сделанных на карте. Они видят только свою личную копию!

Я не понимаю (3). Как изменяется ключевое слово ref (2)? Это позволяет только вызываемому изменять значение переменной, передаваемой вызывающим. Или вы имеете в виду объекты со ссылочными типами?

Другое решение

Интерфейсы были бы другим способом решить эту проблему. Вы можете создать интерфейс ITileMapLayerProperties который будет предоставлять все свойства и передать его конструктору уровня. Карта может либо реализовать сам интерфейс, либо содержать объект TileMapLayerProperties который реализует интерфейс. Но этот слой не нужно знать.

Ответ №1

Вариант 2 будет работать для того, что вы пытаетесь сделать, и вам может и не понадобиться включать ключевое слово ‘ref’. Мне любопытно, какие данные вы пытаетесь получить от дочерних классов? Если они являются коллекциями, вам может не понадобиться ключевое слово ‘ref’. Другой вариант — сделать родительский класс статическим, но я не уверен, что это результат, который вы ищете. Можете ли вы загружать более одной карты плитки за раз? Если нет, рассмотрите статический класс.

Ответ №2

Я думаю, что вариант 3 лучше. Вы можете передать ссылку своего ParentClass в ChildClass и иметь прямой доступ ко всем общедоступным свойствам. Я предложил это лучше, потому что все изменения вы сделаете, будь то из ChildClass или ParentClass, все остальные layers наследуют эти изменения.

Оцените статью
TechArks.Ru
Добавить комментарий