0 / 0 / 0
Регистрация: 21.11.2011
Сообщений: 22
|
|
1 | |
Как сделать открытым свойство для наследника но закрытым для наследника наследника?08.12.2014, 16:58. Показов 2572. Ответов 20
Метки нет (Все метки)
Есть класс GameObject в котором есть свойство Coordinates
Класс Animal наследуется от GameObject и должен содержать метод MoveTo который изменяет Coordinates почутьчуть с учётом скорости животного Класс Rabbit наследуется от Animal Суть в том что Rabbit не должен иметь возможности изменять coordinates как ему вздумается. Он может изменять свои координаты только используя метод MoveTo доставшийся по наследству от Animal. Если сделать свойство Coordinates private, то Animal не сможет с ним работать в методе MoveTo Если сделать это свойство protected, то Rabbit сможет менять координаты как захочет. Как реализовать такую схему, соблюдая принципы ооп?
0
|
08.12.2014, 16:58 | |
Ответы с готовыми решениями:
20
Как переопределить дружественную функцию ввода для класса наследника Два конструктора для класса-наследника Создание экземпляра для наследника абстрактного класса Нельзя создать стиль для наследника кнопки |
2152 / 1289 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
|
|
08.12.2014, 17:07 | 2 |
так и должно быть, если у разных животных будет разная реализация метода MoveTo
а если метод MoveTo в классе Animal не виртуальный, то и Coordinates в классе Animal делай приватным
0
|
0 / 0 / 0
Регистрация: 21.11.2011
Сообщений: 22
|
|
08.12.2014, 17:11 [ТС] | 3 |
В том то и дело, что Coordinates находятся не в классе Animal, а в классе GameObject
0
|
814 / 422 / 169
Регистрация: 08.02.2013
Сообщений: 711
|
||||||||||||||||
08.12.2014, 17:19 | 4 | |||||||||||||||
Tums37, если вы наследуете Кролика от GameObject, то скорее всего где-то есть примерно такой код:
0
|
0 / 0 / 1
Регистрация: 08.12.2014
Сообщений: 6
|
|
08.12.2014, 17:30 | 5 |
Как вариант: использовать в качестве базового родителя GameObject не класс, а интерфейс. Унаследовав его классом Animal объявляете его, как private и Rabbit доступ к нему не получит.
0
|
2152 / 1289 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
|
|
08.12.2014, 17:35 | 6 |
ну тогда делайте либо там метод движения, и закрывайте (privat) координаты, это если у всех движение будет одинаковое
либо в каждом классе реализуйте свой метод движения и координаты будут защищенными. если у некоторых зверей будет одинаковый метод движения то используйте интерфейсы для каждого типа движения
0
|
0 / 0 / 0
Регистрация: 21.11.2011
Сообщений: 22
|
|
08.12.2014, 17:40 [ТС] | 7 |
rRczZZ, Вы не так поняли мой вопрос.
Проблема не в вызове метода MoveTo, а в том, что я пытаюсь скрыть свойство Coordinates от Кролика. Я хочу сделать так, чтобы человек, пишущий логику движений кролика не мог менять координаты как вздумается. Чтобы он мог использовать только метод MoveTo класса Animal. А координаты должны храниться в классе GameObject, от которого наследуется Animal
0
|
2152 / 1289 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
|
|
08.12.2014, 17:54 | 8 |
0
|
0 / 0 / 0
Регистрация: 21.11.2011
Сообщений: 22
|
||||||
08.12.2014, 18:00 [ТС] | 9 | |||||
Свойство Coordinates доступно для чтения, но изменять его напрямую нельзя
0
|
2152 / 1289 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
|
|
08.12.2014, 18:02 | 10 |
вы не ответили на вопрос, что в вашем понимании тогда логика движения, если повлиять на месторасположение объекта мы не можем ?
0
|
3683 / 2594 / 719
Регистрация: 02.08.2011
Сообщений: 6,963
|
|
08.12.2014, 18:03 | 11 |
Имелось ввиду изменить координаты объекта правильно, то есть только через метод MoveTo, не нарушая целостности.
1
|
0 / 0 / 0
Регистрация: 21.11.2011
Сообщений: 22
|
|
08.12.2014, 18:05 [ТС] | 12 |
Можем, используя метод MoveTo, в котором прописаны ограничения, чтобы кролик бежал с определённой скоростью, а не перемещался по полю как захочет.
0
|
3683 / 2594 / 719
Регистрация: 02.08.2011
Сообщений: 6,963
|
|||||||||||
08.12.2014, 18:23 | 13 | ||||||||||
Вообще наследование - самое сильная связь между объектами, которая не разрывается даже во время выполнения.
((С) Тепляков). Так что если ваш класс наследуется (напрямую, либо где-то ниже в иерархии) от класса GameObject, то от этого уже не избавишься, потому что ниже модификатора protected только private, а с private в иерархии уже нету смысла. Но зато можно просто скрыть войство Coordinate от клиентского кода. Мб вы это хотели увидеть:
Подкорректирую именование и иерархию:
1
|
2152 / 1289 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
|
|
08.12.2014, 18:23 | 14 |
никак, если Animal видит свойство родителя - координаты , то и все его наследники будут видеть. Это суть ООП
а чем вам это не нравится?
0
|
3683 / 2594 / 719
Регистрация: 02.08.2011
Сообщений: 6,963
|
|
08.12.2014, 18:36 | 15 |
В методе MoveTo не обязательно просто присваивать новое значение для Coordinate - уже можно проводить валидацию.
Добавлено через 6 минут Там еще наверно понадобится направление и приращение. Смотрите как у структуры Point передвижение устроено (есть перегрузка с dx и dy).
1
|
0 / 0 / 0
Регистрация: 21.11.2011
Сообщений: 22
|
|
08.12.2014, 18:40 [ТС] | 16 |
Моя задача - скрыть свойство Coordinates от самого класса Rabbit. Предполагается, что класс Rabbit или Wolf или ещё какой нибудь будет писать человек, который сильно хочет всё испортить.
Нельзя позволять изменять свойство Coordinates в классе Rabbit. Конечно можно просто перенести метод MoveTo в класс Gameobject, но это не очень хорошо, так как помимо животных на поле могут быть камни например или трава, которые не могут куда либо перемещаться и у которых не должно быть ни скорости ни метода MoveTo
0
|
3683 / 2594 / 719
Регистрация: 02.08.2011
Сообщений: 6,963
|
|
08.12.2014, 18:58 | 17 |
Думаю, такое нельзя сделать.
Добавлено через 10 минут Вообще в этом суть наследования - моделировать отношение "'является", то есть перенимать свойства родительского объекта и добавлять собственные. Если не хотите перенимать свойства родительского объекта - тогда не наследуйтесь от него.
1
|
286 / 192 / 56
Регистрация: 25.12.2012
Сообщений: 640
|
||||||
08.12.2014, 19:33 | 18 | |||||
Можно. Пихайте в отдельную DLL.
1
|
3683 / 2594 / 719
Регистрация: 02.08.2011
Сообщений: 6,963
|
|
08.12.2014, 19:41 | 19 |
Но в случае с одним свойством объект не имеет никакого смысла - он пустой.
Добавлено через 1 минуту Тогда уж internal как модификатор класса.
0
|
2152 / 1289 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
|
|
08.12.2014, 19:48 | 20 |
при чем тут это, человек просто показал как сделать то, что хочет ТС, без деталей реализации.
ТСу еще раз напишу что это костыль, противоречащий ООП. если человек пишет класс кролика -то он вполне имеет право определять его координаты, если не доверяете другому писать этот класс, напишите сами и сделайте сборку. тем более метод MoveTo должен виртуальным, и переопределенным для разных зверей , ибо кролик и птица могут двигаться совершенно по разному.. (птица может двигаться еще и вверх) соответственно логика метода движения должна быть написана в каждом классе , или добавить еще пару абстракных классов по методам передвижения зверей, или же интерфейсов
1
|
08.12.2014, 19:48 | |
08.12.2014, 19:48 | |
Помогаю со студенческими работами здесь
20
Как написать класс MainFile, от которого нельзя сделать наследника Создать абстрактный класс фигур и сделать 2 наследника (треугольник, прямоугольник) Как объявить наследника TThread? Как сделать явное приведения переменной типа класса-наследника к типу базового класса? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |