6 / 6 / 0
Регистрация: 02.11.2012
Сообщений: 44
1

Наследование и static поля

20.09.2013, 13:24. Показов 12511. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Не могу понять почему так происходит.
Создаю класс Ship с одним public static свойством.
Создаю два класса наследника Fighter и Destroyer.
Вывожу на консоль значение поля weapon для каждого класса (по умолчанию ноль).
Меняю значение поля weapon для класса Ship и значение поля weapon меняется и у наследников (Можно поменять значение поля и у кого-нибудь из наследников, ничего не поменяется. Все классы, в том числе и родитель тоже будут иметь новое значение поля).
Почему? Подскажите кто знает.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(Ship.weapon);
        Console.WriteLine(Fighter.weapon);
        Console.WriteLine(Destroyer.weapon);
        Console.ReadLine();
 
        Ship.weapon = 10;
        Console.WriteLine(Ship.weapon);
        Console.WriteLine(Fighter.weapon);
        Console.WriteLine(Destroyer.weapon);
        Console.ReadLine();
    }
}
class Ship
{
    public static int weapon;
}
class Fighter : Ship { }
class Destroyer : Ship { }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.09.2013, 13:24
Ответы с готовыми решениями:

Static поля и многопоточность. Нетривиальная задача.
Нетривиальная задача. Есть класс: public static class My { public static StringBuilder sb =...

Наследование readonly поля
Здравствуй, киберфорум. Изучаю C# и .NET с помощью книги Эндрю Троеллсена. Дошёл до полей,...

Наследование static членов
Какое нормальное решение такой задачи: Есть базовый класс. И от него нужно унаследовать много...

Наследование классов и обращение к Private/Static
Здравствуйте! У меня возникла проблема при попытке унаследовать параметры класса... У меня есть 2...

15
708 / 708 / 226
Регистрация: 04.03.2013
Сообщений: 1,384
20.09.2013, 13:43 2
static
C#
1
2
3
4
5
6
7
8
9
10
11
12
public class Ship
{
        public static int weapon = 0;
}
public class Ship1 : Ship
{ 
        public new static int weapon = 1;
}
public class Ship2 : Ship 
{ 
        public new static int weapon = 2;
}
0
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
Цитата Сообщение от Vasaka Посмотреть сообщение
(Можно поменять значение поля и у кого-нибудь из наследников, ничего не поменяется
не согласен, поменяются поля у всех наследников и у базового класса.

В принципе всё логично, поле то статическое. я по правде говоря не понимаю как может быть по другому, поле то объявлено один раз для трех классов, с чего бы ему иметь различные значения? ведь как указывалось - оно static. один из вариантов решения:

C#
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
using System;
using System.Management;
using System.Collections.Generic;
 
public class Sample
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(Ship.weapon);
            Console.WriteLine(Fighter.weapon);
            Console.WriteLine(Destroyer.weapon);
            Console.ReadLine();
        }
    }
    abstract class Ship
    {
        public const int weapon=0;
    }
    class Fighter : Ship
    {
        public new const int weapon=10;
    }
    class Destroyer : Ship 
    {
        public new const int weapon = 15;
    }
}
Добавлено через 2 минуты
const логичнее для данной ситуации: статик поле может изменяться, и если оно изменится - изменятся значения у всех объектов данного класса. я просто не могу придумать ситуацию, когда у ВСЕХ торпедных барж оружие стало в два раза больше, а у подводных плотов осталось на том же уровне
1
Kruds
20.09.2013, 13:56
  #7

Не по теме:

Цитата Сообщение от Spectral-Owl Посмотреть сообщение
const логичнее для данной ситуации: статик поле может изменяться, и если оно изменится - изменятся значения у всех объектов данного класса. я просто не могу придумать ситуацию, когда у ВСЕХ торпедных барж оружие стало в два раза больше, а у подводных плотов осталось на том же уровне
В том и смысл что баржи и плоты - разные классы кораблей. Тут уж скорее что Экзибит прокачал одну конкретную баржу и пушек на ней стало в два раза больше, в этом случае я с вами согласен, static не катит.

0
6 / 6 / 0
Регистрация: 02.11.2012
Сообщений: 44
20.09.2013, 13:59  [ТС] 8
Цитата Сообщение от Spectral-Owl Посмотреть сообщение
В принципе всё логично, поле то статическое. я по правде говоря не понимаю как может быть по другому, поле то объявлено один раз для трех классов, с чего бы ему иметь различные значения? ведь как указывалось - оно static. один из вариантов решения:
А не должно разве при наследовании в новом классе быть своё static поле с тем же именем?

Цитата Сообщение от Kruds Посмотреть сообщение
Что остроумного? Вы задали вопрос почему static-значение меняется во всех классах семейства - я дал вам ссылку на ответ и дал пример как это можно обойти.
Кода не было, примера не было. Только ссылка на справку. С тем же успехом можно было посоветовать книгу Шилдта или Троелсена, мол там всё это есть.
0
708 / 708 / 226
Регистрация: 04.03.2013
Сообщений: 1,384
20.09.2013, 14:03 9
Нет, оно наследуется. Если нужно свое поле с тем же именем - используйте перекрытие (модификатор new).

Добавлено через 3 минуты
Цитата Сообщение от Vasaka Посмотреть сообщение
Кода не было, примера не было. Только ссылка на справку. С тем же успехом можно было посоветовать книгу Шилдта или Троелсена, мол там всё это есть.
Несвоевременно подредактировал сообщение, пардон. Но если уж на то пошло, статья про одно ключевое слово куда меньше книги Шилдта
1
6 / 6 / 0
Регистрация: 02.11.2012
Сообщений: 44
20.09.2013, 14:10  [ТС] 10
Цитата Сообщение от Kruds Посмотреть сообщение
Несвоевременно подредактировал сообщение, пардон. Но если уж на то пошло, статья про одно ключевое слово куда меньше книги Шилдта
Конечно меньше. И я согласен что надо фундаментально подходить к изучению, а не на форумах вопросы задавать, но иногда бывает происходит какой-то затык и в книге, хоть разорвись, ничего не получается найти, а голова уже кипит. И главное не понятно почему не работает, хотя по логике вещей вроде бы должно работать.
Мне казалось, что если создаётся класс наследник, то у него должно быть своё наследуемое поле. Поле же не метод, его не надо переопределять.

Цитата Сообщение от Kruds Посмотреть сообщение
Нет, оно наследуется. Если нужно свое поле с тем же именем - используйте перекрытие (модификатор new).
А в противном случае все поля будут ссылаться на один объект в куче?
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 минуту
Цитата Сообщение от Spectral-Owl Посмотреть сообщение
const логичнее для данной ситуации: статик поле может изменяться, и если оно изменится - изменятся значения у всех объектов данного класса. я просто не могу придумать ситуацию, когда у ВСЕХ торпедных барж оружие стало в два раза больше, а у подводных плотов осталось на том же уровне
В настолках, обычно, у всех кораблей одного класса одинаковые характеристики, а кораблей может быть много.
Поэтому характеристики прописаны в статик полях, плюс свойства, чтобы можно было обратиться к статик полям через любой экземпляр класса, и одно индивидуальное поле жизни для каждого экземпляра класса.
Глупо будет у каждого корабля иметь все характеристики корабля, если они у всех кораблей одинаковые.
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
20.09.2013, 20:28 13
У меня получалось извращаться и делать статик виртуальные поля (уже не помню, но инструменты а-ля рефлексия и копание в системных неймспейсах там точно были). Нужно это например, чтобы сделать абстрактный класс человек и у него статическое виртуальное поле IsMale. Затем от него наследуют поля мужчины и женщины. Логично, что у мужчины это поле должно возвращать true, а у женщины - false. Но нельзя объявлять статик поле абстрактным. В результате я так все-таки сделал, а значение поля вытаскивал с помощью рефлексии.
0
6 / 6 / 0
Регистрация: 02.11.2012
Сообщений: 44
20.09.2013, 20:36  [ТС] 14
Цитата Сообщение от Psilon Посмотреть сообщение
У меня получалось извращаться и делать статик виртуальные поля (уже не помню, но инструменты а-ля рефлексия и копание в системных неймспейсах там точно были). Нужно это например, чтобы сделать абстрактный класс человек и у него статическое виртуальное поле IsMale. Затем от него наследуют поля мужчины и женщины. Логично, что у мужчины это поле должно возвращать true, а у женщины - false. Но нельзя объявлять статик поле абстрактным. В результате я так все-таки сделал, а значение поля вытаскивал с помощью рефлексии.
В моём случае обычные статические поля полностью удовлетворяют нужды. Просто я не думал, что статик и не статик поля будут при наследовании вести себя по разному, ну и не знал как эту проблему решить.
Сейчас уже всё переделал, всё работает.
0
Master of Orion
Эксперт .NET
6098 / 4954 / 905
Регистрация: 10.07.2011
Сообщений: 14,522
Записей в блоге: 5
20.09.2013, 20:36 15
Vasaka, да я рад за вас. Просто вот такой костыль мне например пришлось делать, вдруг кому пригодится
0
6 / 6 / 0
Регистрация: 02.11.2012
Сообщений: 44
20.09.2013, 20:42  [ТС] 16
Вполне возможно.
0
20.09.2013, 20:42
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.09.2013, 20:42
Помогаю со студенческими работами здесь

Наследование static атрибута(хранение количества объектов наследуемых классов)
Есть абстрактный класс base, от него наследуются 3 класса child1 child2 child3. Создается множество...

Static поля класса
объясните нубу, вот имею я такой код на С# class WebResponse { public static...

Static поля в классе и инициализация
Мне нужен класс, у которого было бы общие переменные и функции их устанавливающие \ читающие для...

ООП. Наследование. Поля
Добрый день! Просвятите вот по такому вопросу: #include <QCoreApplication> #include <iostream>...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru