Использование класса в другом классе
Мне нужно, чтобы при создании объекта класса Object также создавался объект класса SimpleCollider, но в том объекте. Далее я хочу использовать методы объекта класса SimpleCollider через объект класса Object.
Извиняюсь за плохую формулировку, я весь день работал и устал, пишу поздно и ничего не понимаю. Может, по коду поймёте.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
class Object { public: //string File; float speed; int dir; Image image; Texture texture; Sprite sprite; ////////// class SimpleCollider { public: float getPos1X() { return Pos1X; } float getPos1Y() { return Pos1Y; } //////////////////////////// float getPos2X() { return Pos2X; } float getPos2Y() { return Pos2Y; } //////////////////////////// void setPos1X(float x) { Pos1X = x; } void setPos1Y(float y) { Pos1Y = y; } ////////////////////////// void setPos2X(float x) { Pos2X = x; } void setPos2Y(float y) { Pos2Y = y; } SimpleCollider(float Pos1X, float Pos1Y, float Pos2X, float Pos2Y) { this->Pos1X = Pos1X; this->Pos1Y = Pos1Y; this->Pos2X = Pos2X; this->Pos2Y = Pos2Y; } private: float Pos1X; float Pos1Y; float Pos2X; float Pos2Y; }; float Collider[1]; Object( float x, float y, string File, float scaleX,float scaleY, int W, int H) { speed = 0; this->x = x; this->y = y; this->speed = speed; image.loadFromFile("images/" + File); texture.loadFromImage(image); sprite.setTexture(texture); sprite.setScale(scaleX, scaleY); sprite.setOrigin(W/2, H/2); SimpleCollider Collider((x-W*scaleX),(y+H*scaleY),(x+W*scaleX),(y-H*scaleY)); } /////////// void update(float time) { switch(dir) { case 0: x -= speed * time; break; case 1: x += speed * time; break; case 2: y -= speed * time; break; case 3: y += speed * time; break; } speed = 0; sprite.setPosition(x,y); } Sprite draw() { return sprite; } float getX() { return x; } float getY() { return y; } void setX(float x) { this->x = x; } void setY(float y) { this->y = y; } private: float x,y; float health; bool isLife; float Size; };
Что должно быть дальше:
Object player(540, 635, "player.png",0.5, 0.5, 514, 514); coutplayer.Collider.getPos1X();
Использование классов внутри других классов
Бывает такое, что мы хотели бы использовать методы одного класса внутри другого, но не хотели бы наследовать от этого класса.
Почему мы не хотим наследовать?
Во-первых, используемый класс может являться вспомогательным и по логике нашего кода может не подходить на роль родителя.
Во-вторых, мы можем захотеть использовать несколько классов внутри другого класса, а с наследованием это не получится, ведь в PHP у класса может быть только один родитель.
Давайте посмотрим на практическом примере. Пусть у нас дан следующий класс Arr , в объект которого мы можем добавлять числа с помощью метода add :
Давайте теперь добавим в наш класс метод, который будет находить сумму квадратов элементов и прибавлять к ней сумму кубов элементов.
Пусть у нас уже существует класс SumHelper , имеющий методы для нахождения сумм элементов массивов:
Логично будет не реализовывать нужные нам методы еще раз в классе Arr , а воспользоваться методами класса SumHelper внутри класса Arr .
Для этого в классе Arr внутри конструктора создадим объект класса SumHelper и запишем его в свойство sumHelper :
Теперь внутри Arr доступно свойство $this->sumHelper , в котором хранится объект класса SumHelper с его публичными методами и свойствами (если бы публичные свойства были, сейчас их там нет, только публичные методы).
Создадим теперь в классе Arr метод getSum23 , который будет находить сумму квадратов элементов и прибавлять к ней сумму кубов элементов, используя методы класса SumHelper :
sumHelper = new SumHelper; > // Находим сумму квадратов и кубов элементов массива: public function getSum23() < // Для краткости запишем $this->nums в переменную: $nums = $this->nums; // Найдем описанную сумму: return $this->sumHelper->getSum2($nums) + $this->sumHelper->getSum3($nums); > public function add($number) < $this->nums[] = $number; > > ?>?php>
Давайте воспользуемся созданным классом Arr :
add(1); // добавляем в массив число 1 $arr->add(2); // добавляем в массив число 2 $arr->add(3); // добавляем в массив число 3 // Находим сумму квадратов и кубов: echo $arr->getSum23(); ?>?php>
Самостоятельно повторите описанные мною классы Arr и SumHelper .
Создайте класс AvgHelper с методом getAvg , который параметром будет принимать массив и возвращать среднее арифметическое этого массива (сумма элементов делить на количество).
Добавьте в класс AvgHelper еще и метод getMeanSquare , который параметром будет принимать массив и возвращать среднее квадратичное этого массива (квадратный корень, извлеченный из суммы квадратов элементов, деленной на количество).
Добавьте в класс Arr метод getAvgMeanSum , который будет находить сумму среднего арифметического и среднего квадратичного из массива $this->nums .
Как использовать метод класса в другом классе python?
Для этого нужно указать этот класс в качестве родителя по отношению к текущему классу. Например, если в нашем классе MyClass мы хотим использовать метод method класса Parent :
class MyClass(Parent): # наследуем от класса Parent pass MyClass.method # # метод method родительского класса доступен для использования
Как вызывать класс в другом классе?
Как вызывать класс А в классе B чтобы пользоваться им в нескольких методах?
Класс B во многих методах вызывает класс А. Можно вызвать один раз, а в методах только обращаться к нужным методам с класса А?
Нормально обьяснил что хочу?
- Вопрос задан более трёх лет назад
- 236 просмотров
Комментировать
Решения вопроса 1
1. Внедрение зависимости
2. Наследование (для похожих объектов)
Пример с Dependency injection:
class A < public function print() < return 'Some text. '; >> Class B < protected $a; public function __construct(A $a) < $this->a = $a; > public function print()< return $this->a->print(); > > $a = new A(); $b = new B($a); echo $b->print(); // Some text.
Ответ написан более трёх лет назад
Нравится 1 6 комментариев
romaaa32 @romaaa32 Автор вопроса
Т.е. только передавая аргументом можно?
romaaa32, нет, в данном случае A — тип аргумента функции.
Это гарантирует, что первым аргументом будет передана переменная типа А.
Несколько классов можно добавить таким же способом.
romaaa32, можно разными способами, но пример выше (внедрение зависимости) соответствует принципу единой ответственности.
По первой ссылке есть пример внедрения нескольких зависимостей.