6 / 6 / 0
Регистрация: 02.11.2012
Сообщений: 44
|
||||||
1 | ||||||
Наследование и static поля20.09.2013, 13:24. Показов 12511. Ответов 15
Метки нет (Все метки)
Не могу понять почему так происходит.
Создаю класс Ship с одним public static свойством. Создаю два класса наследника Fighter и Destroyer. Вывожу на консоль значение поля weapon для каждого класса (по умолчанию ноль). Меняю значение поля weapon для класса Ship и значение поля weapon меняется и у наследников (Можно поменять значение поля и у кого-нибудь из наследников, ничего не поменяется. Все классы, в том числе и родитель тоже будут иметь новое значение поля). Почему? Подскажите кто знает.
0
|
20.09.2013, 13:24 | |
Ответы с готовыми решениями:
15
Static поля и многопоточность. Нетривиальная задача. Наследование readonly поля Наследование static членов Наследование классов и обращение к Private/Static |
6 / 6 / 0
Регистрация: 02.11.2012
Сообщений: 44
|
|
20.09.2013, 13:49 [ТС] | 3 |
Kruds, наверное это остроумно, но вопрос остаётся открытым.
0
|
708 / 708 / 226
Регистрация: 04.03.2013
Сообщений: 1,384
|
|
20.09.2013, 13:50 | 4 |
Что остроумного? Вы задали вопрос почему static-значение меняется во всех классах семейства - я дал вам ссылку на ответ и дал пример как это можно обойти.
0
|
340 / 340 / 90
Регистрация: 04.03.2010
Сообщений: 648
|
|
20.09.2013, 13:50 | 5 |
в вопросе Вашем ответ ищите Вы...
0
|
608 / 583 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
|
||||||
20.09.2013, 13:54 | 6 | |||||
не согласен, поменяются поля у всех наследников и у базового класса.
В принципе всё логично, поле то статическое. я по правде говоря не понимаю как может быть по другому, поле то объявлено один раз для трех классов, с чего бы ему иметь различные значения? ведь как указывалось - оно static. один из вариантов решения:
const логичнее для данной ситуации: статик поле может изменяться, и если оно изменится - изменятся значения у всех объектов данного класса. я просто не могу придумать ситуацию, когда у ВСЕХ торпедных барж оружие стало в два раза больше, а у подводных плотов осталось на том же уровне
1
|
Kruds
|
20.09.2013, 13:56
#7
|
0
|
6 / 6 / 0
Регистрация: 02.11.2012
Сообщений: 44
|
|
20.09.2013, 13:59 [ТС] | 8 |
А не должно разве при наследовании в новом классе быть своё static поле с тем же именем?
Кода не было, примера не было. Только ссылка на справку. С тем же успехом можно было посоветовать книгу Шилдта или Троелсена, мол там всё это есть.
0
|
708 / 708 / 226
Регистрация: 04.03.2013
Сообщений: 1,384
|
|
20.09.2013, 14:03 | 9 |
Нет, оно наследуется. Если нужно свое поле с тем же именем - используйте перекрытие (модификатор new).
Добавлено через 3 минуты Несвоевременно подредактировал сообщение, пардон. Но если уж на то пошло, статья про одно ключевое слово куда меньше книги Шилдта
1
|
6 / 6 / 0
Регистрация: 02.11.2012
Сообщений: 44
|
|
20.09.2013, 14:10 [ТС] | 10 |
Конечно меньше. И я согласен что надо фундаментально подходить к изучению, а не на форумах вопросы задавать, но иногда бывает происходит какой-то затык и в книге, хоть разорвись, ничего не получается найти, а голова уже кипит. И главное не понятно почему не работает, хотя по логике вещей вроде бы должно работать.
Мне казалось, что если создаётся класс наследник, то у него должно быть своё наследуемое поле. Поле же не метод, его не надо переопределять. А в противном случае все поля будут ссылаться на один объект в куче?
0
|
708 / 708 / 226
Регистрация: 04.03.2013
Сообщений: 1,384
|
|
20.09.2013, 14:14 | 11 |
Да.
1
|
6 / 6 / 0
Регистрация: 02.11.2012
Сообщений: 44
|
|
20.09.2013, 18:13 [ТС] | 12 |
Ясно. Большое спасибо!
Тему можно закрывать. Добавлено через 3 часа 51 минуту В настолках, обычно, у всех кораблей одного класса одинаковые характеристики, а кораблей может быть много. Поэтому характеристики прописаны в статик полях, плюс свойства, чтобы можно было обратиться к статик полям через любой экземпляр класса, и одно индивидуальное поле жизни для каждого экземпляра класса. Глупо будет у каждого корабля иметь все характеристики корабля, если они у всех кораблей одинаковые.
0
|
Master of Orion
|
|
20.09.2013, 20:28 | 13 |
У меня получалось извращаться и делать статик виртуальные поля (уже не помню, но инструменты а-ля рефлексия и копание в системных неймспейсах там точно были). Нужно это например, чтобы сделать абстрактный класс человек и у него статическое виртуальное поле IsMale. Затем от него наследуют поля мужчины и женщины. Логично, что у мужчины это поле должно возвращать true, а у женщины - false. Но нельзя объявлять статик поле абстрактным. В результате я так все-таки сделал, а значение поля вытаскивал с помощью рефлексии.
0
|
6 / 6 / 0
Регистрация: 02.11.2012
Сообщений: 44
|
|
20.09.2013, 20:36 [ТС] | 14 |
В моём случае обычные статические поля полностью удовлетворяют нужды. Просто я не думал, что статик и не статик поля будут при наследовании вести себя по разному, ну и не знал как эту проблему решить.
Сейчас уже всё переделал, всё работает.
0
|
6 / 6 / 0
Регистрация: 02.11.2012
Сообщений: 44
|
|
20.09.2013, 20:42 [ТС] | 16 |
Вполне возможно.
0
|
20.09.2013, 20:42 | |
20.09.2013, 20:42 | |
Помогаю со студенческими работами здесь
16
Наследование static атрибута(хранение количества объектов наследуемых классов) Static поля класса Static поля в классе и инициализация ООП. Наследование. Поля Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |