У меня есть класс ящиков, которые нужно перемещать в сетке, но нужно получить доступ к этим координатам сетки в своих методах. Я не хочу, чтобы мои классы наследовали сетку, если только это не нужно. Нужно ли передавать сетку в классы в качестве параметра или сделать классы ящиков унаследованными от класса сетки? Спасибо.
Это редактирование. Позвольте пояснить. Классы ящиков должны знать длину и ширину сетки. Поэтому мне нужно вызвать внутри функций класса, таких как Grid.length() и прочее. Мне нужно это, хотя, чтобы дать мне длину и ширину сетки, которая была создана.
Общее правило будет параметром.
Вопрос: is- a vs. has- a:
Is the box a grid?
yes: # if so, then is it really a box???
The box should inherit grid
no:
The box should get a reference to the grid
#(generally through a setter or constructor parameter).
Пример:
class Grid:
def __init__(self,width=1,height=1):
this.width = width; this.height = height;
def getDimensions(self):
return (this.width, this.height)
class Box:
def __init__(self, grid):
this.__grid = grid; this.x = 0; this.y = 0
def verify(self):
width, height = this.__grid.dimensions()
if this.x < width and this.y < height:
print( "A-OK!" );
else
print( "I am off the grid!!!" )
grid = Grid();
box = Box(grid);
box.verify();
Поскольку ящик не является уточнением типа сетки, вы не должны наследовать их.
Вам может быть интересен шаблон Acquisition и модуль. Это позволяет получать атрибуты из динамической иерархии сдерживания, а не в статическом классе (is- a).
Коробка должна ссылаться на сетку. Однако с внутренними классами вам не нужно передавать сетку в качестве параметра с внутренними классами. Внутренние классы - это Java-функция, но вы можете метапрограммировать ее на Python.
Из того, что вы сказали, классы box
не должны наследоваться от класса grid
, так как это нарушит LSP.
Смотрите: Что такое принцип замены Лискова?
Классы box
должны знать, как запросить grid
для соответствующей информации.