С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
4 / 4 / 3
Регистрация: 26.07.2016
Сообщений: 96

Пустое поле в производном классе

16.02.2017, 13:03. Показов 2861. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Не могли бы вы подсказать ответ на такой вопрос:
Есть базовый класс:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
public class AutoOrganization
    {
        public string Name { get; set; }
 
        public AutoOrganization(string name)
        {
            this.Name = name;
        }
        public virtual void GetInfo()
        {
            Console.WriteLine("Название автопредприятия: "+Name);
        }
    }
И далее создаются производные классы, которые помимо прочего будут дополнять метод GetInfo базового класса своими данными:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
private static double Mileage;
        private static int busCount;
        public Bus(double mileage)
        {
            Mileage += mileage;
            busCount++;
        }
        public static void GetMileage()
        {
            Console.WriteLine("Пробег: "+Mileage);
        }
        public double AverageMileage()
        {
            return Mileage / busCount;
        }
        public override void GetInfo()
        {
            base.GetInfo();
            Console.WriteLine("Общий пробег автобусов: " + Mileage);
            Console.WriteLine("Количество автобусов в автопарке: "+busCount);
            Console.WriteLine("Средний пробег одного автобуса: " + AverageMileage());
        }
    }
Вопрос собственно заключается в том, что в производных классах поле base.GetInfo() пустое, но если свойству Name в базовом классе сразу задать значение, а не из конструктора, то все выводится правильно...
Подскажите, что подправить надобно!
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.02.2017, 13:03
Ответы с готовыми решениями:

Наследование метода toString() в производном классе
В главном классе определил метод toString(): /// <summary> /// вывод на экран значений /// </summary> ...

Вызов события в производном классе, которое объявлено в базовом
Доброго времени суток, Господа. Возник вопрос. Есть класс A: public abstract class A { public event...

Можно ли сделать виртуальный метод в производном классе с другими наборами параметров?
это метод в базвом классе public virtual void Adding() { } а допустим этот в производном...

10
64 / 64 / 35
Регистрация: 14.12.2015
Сообщений: 145
16.02.2017, 13:15
toni_bel, привет! Может Вы забыли про base(name)? Вот так работает
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
30
31
32
33
34
public class Base
{
    public Base(string name)
    {
        Name = name;
    }
 
    public virtual void GetInfo()
    {
        Console.WriteLine("Base GetInfo: " + Name);
    }
    public string Name { get; set; }
}
 
public class Derived : Base
{
    public string Custom { get; set; } = "bla bla";
    public Derived(string name) : base(name)
    {
    }
 
    public override void GetInfo()
    {
        base.GetInfo();
        Console.WriteLine("Derived GetInfo: " + Custom);
    }
}
 
static void Main()
{
    var object1 = new Derived("my name");
    object1.GetInfo();
    Console.ReadKey();
}
1
4 / 4 / 3
Регистрация: 26.07.2016
Сообщений: 96
16.02.2017, 13:31  [ТС]
такая реализация ведь предусматривает ввод имени базового класса для каждого объекта, создаваемого из производного класса?
А я думал как можно один раз имя ввести для базового класса...
В итоге буду создавать список базового класса,в который запихну в рандомном порядке все производные классы, и хотелось бы избежать постоянной необходимости ввода информации с именем базового класса.
0
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
16.02.2017, 13:50
toni_bel,
А кто решил автобус от автопарка наследовать?
1
4 / 4 / 3
Регистрация: 26.07.2016
Сообщений: 96
16.02.2017, 14:04  [ТС]
Вот все задание:
1. Разработать иерархию классов для учёта автомобильного парка автопредприятия. Предусмотреть
возможность вывода информации о среднем пробеге по каждой категории автотранспорта.
Может я чего не так понял...
0
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
16.02.2017, 14:24
toni_bel,
Я бы сделал так:
1) Базовый (абстрактный?) класс - транспортное средство.
2) Производные классы - легковой автомобиль, грузовой автомобиль, автобус
3) Класс Автопарк, полем которого является коллекция транспортных средств
1
4 / 4 / 3
Регистрация: 26.07.2016
Сообщений: 96
16.02.2017, 15:20  [ТС]
Реализовал в таком виде:
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
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
128
129
130
131
132
namespace AutoParkLib
{
    public abstract class Auto
    {
        public string Name { get; set; } = "Autopark No.1";
 
        /*public Auto(string name)
        {
            Name = name;
        }*/
 
        public virtual void GetInfo()
        {
            Console.WriteLine("Название автопредприятия: "+Name);
        }
        public abstract double AverageMileage();
    }
 
    public class Bus:Auto
    {
        private static double Mileage;
        private static int busCount;
        public Bus()
        {
            Mileage += 100;
            busCount++;
        }
        public Bus(double mileage)
        {
            Mileage += mileage;
            busCount++;
        }
        public override double AverageMileage()
        {
            return Mileage / busCount;
        }
        public override void GetInfo()
        {
            base.GetInfo();
            Console.WriteLine("Общий пробег автобусов: " + Mileage);
            Console.WriteLine("Количество автобусов в автопарке: "+busCount);
            Console.WriteLine("Средний пробег одного автобуса: " + AverageMileage());
        }
    }
    
    public class Truck:Auto
    {
        private static double Mileage;
        private static int truckCount;
        public Truck()
        {
            Mileage += 150;
            truckCount++;
        }
        public Truck(double mileage)
        {
            Mileage += mileage;
            truckCount++;
        }
 
        public override double AverageMileage()
        {
            return Mileage / truckCount;
        }
        public override void GetInfo()
        {
            base.GetInfo();
            Console.WriteLine("Общий пробег грузовиков: " + Mileage);
            Console.WriteLine("Количество грузовиков в автопарке: " + truckCount);
            Console.WriteLine("Средний пробег одного грузовика: " + AverageMileage());
        }
    }
    public class Taxi:Auto
    {
        private static double Mileage { get; set; }
        private static int taxiCount;
        public Taxi()
        {
            Mileage += 60;
            taxiCount++;
        }
        public Taxi(double mileage)
        {
            Mileage += mileage;
            taxiCount++;
        }
        public override double AverageMileage()
        {
            return Mileage / taxiCount;
        }
        public override void GetInfo()
        {
            base.GetInfo();
            Console.WriteLine("Общий пробег такси: " + Mileage);
            Console.WriteLine("Количество такси в автопарке: " + taxiCount);
            Console.WriteLine("Средний пробег одного такси: " + AverageMileage());
        }
    }
}
class Program
    {
        static void Main(string[] args)
        {
            List<Auto> auto = new List<Auto>();
            Random rnd = new Random();
            for (int i = 0; i < 6; i++)
            {
                int index = rnd.Next(1, 4);
                if(index==1)
                    auto.Add(new Bus());
                if (index == 2)
                    auto.Add(new Truck());
                else
                    auto.Add(new Taxi());
            }
            foreach (var item in auto)
            {
                if (item is Bus)
                    item.GetInfo();
 
                if (item is Truck)
                     item.GetInfo();
 
                if (item is Taxi)
                     item.GetInfo();
                Console.WriteLine(item.GetType().Name);
                    
            }
                   
            Console.ReadKey();
        }
    }
Подскажите Ваше мнение, что можно оптимизировать?
И подскажите в цикле foreach только флагами можно сделать, чтобы выводило на экран только по одному сообщению по каждому подклассу?

Добавлено через 6 минут
Через флаги получится как-то так...
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
bool visitB = false;
            bool visitTr = false;
            bool visitT = false;
            foreach (var item in auto)
            {
                
                if (item is Bus&&!visitB)
                {
                    item.GetInfo();
                    visitB = true;
                }
                    
 
                if (item is Truck&&!visitTr)
                {
                    item.GetInfo();
                    visitTr=true;
                }
                     
 
                if (item is Taxi&&!visitT)
                {
                    item.GetInfo();
                    visitT = true;
                }
            }
Добавлено через 2 минуты
Цитата Сообщение от Даценд Посмотреть сообщение
toni_bel,
Я бы сделал так:
1) Базовый (абстрактный?) класс - транспортное средство.
2) Производные классы - легковой автомобиль, грузовой автомобиль, автобус
3) Класс Автопарк, полем которого является коллекция транспортных средств
по п.3 мне получается остается только создание списка вынести в отдельный класс?
0
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
16.02.2017, 16:22
Лучший ответ Сообщение было отмечено toni_bel как решение

Решение

toni_bel,
Я бы сделал что-то типа:
Кликните здесь для просмотра всего текста
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
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
using System;
using System.Collections.Generic;
using System.Linq;
 
namespace AutoParkLib
{
    public abstract class Auto
    {
        public string Number { get; set; }
        public int Mileage { get; set; }
        public Auto(string number, int mileage)
        {
            Number = number;
            Mileage = mileage;
        }
    }
 
    public class Bus : Auto
    {
        private int SeatsNumber { get; set; }
        public Bus(string number, int mileage, int seatsNumber)
            : base(number, mileage)
        {
            SeatsNumber = seatsNumber;
        }
    }
 
    public class Truck : Auto
    {
        public int Carrying { get; set; }
        public Truck(string number, int mileage, int carrying)
            : base(number, mileage)
        {
            Carrying = carrying;
        }
    }
 
    public class AutoPark
    {
        public List<Auto> AutoList { set; get; }
        public string ParkName;
        public AutoPark(string parkName)
        {
            ParkName = parkName;
            AutoList = new List<Auto>();
        }
 
        public void Add(Auto auto)
        {
            AutoList.Add(auto);
        }
 
        public double AverMiliage<T>()
        {
            return AutoList.OfType<T>().Average(x => (x as Auto).Mileage);
        }
 
    }
 
    class Program
    {
        public static void Main(string[] args)
        {
            AutoPark park = new AutoPark("Автопарк №1");
            park.Add(new Bus("123321", 500000, 55));
            park.Add(new Truck("3245345", 100000, 5));
            park.Add(new Bus("56786", 200000, 80));
            park.Add(new Truck("2345", 120000, 15));
            park.Add(new Bus("567856", 260000, 40));
            Console.WriteLine("Средний пробег автобусов {0}", park.AverMiliage<Bus>());
            Console.WriteLine("Средний пробег грузовиков {0}", park.AverMiliage<Truck>());
        }
 
    }
}
1
4 / 4 / 3
Регистрация: 26.07.2016
Сообщений: 96
16.02.2017, 17:04  [ТС]
Спасибо за помощь!
А может порекомендуете чего почитать хорошего про list, а то не понятно мне как вы так лихо средний киллометраж получили?
мой способ не годится из-за использования статических данных или просто неоптимально построено взаимодействие с классами?
0
Эксперт .NET
 Аватар для Даценд
5878 / 4755 / 2939
Регистрация: 20.04.2015
Сообщений: 8,361
16.02.2017, 17:34
Цитата Сообщение от toni_bel Посмотреть сообщение
А может порекомендуете чего почитать хорошего про list, а то не понятно мне как вы так лихо средний киллометраж получили?
Литературы хорошей много. Только читать нужно еще и про linq и про обобщенные методы.
Цитата Сообщение от toni_bel Посмотреть сообщение
мой способ не годится из-за использования статических данных или просто неоптимально построено взаимодействие с классами?
Скорей комплексно.
Статическое поле хранящее количество, например busCount, не даст возможности посчитать количество, а соответственно и средний пробег, в определенном автопарке, если их несколько. Поэтому я не вижу смысла вводить поле, хранящее общее количество объектов класса. Тем более, что при удалении объекта, это количество не уменьшается.
Второе, на что хочется обратить внимание, это вывод на консоль из методов класса. Это неправильно. Класс ничего не должен знать о консоли. Метод должен возвращать значение в точку вызова. А уж как использовать это значение (выводить на консоль, на форму или использовать в выражении) классу должно быть все равно.
0
4 / 4 / 3
Регистрация: 26.07.2016
Сообщений: 96
16.02.2017, 17:53  [ТС]
Я сейчас читаю Шилдта с# 4.0, но еще не дошел до этих тем. И по Троэлсену тоже добрался только до начала наследования.
Я просто завязался на статических подсчетах количества объектов и сумме их пробегов, потому что не знаю толком о функциональности списков, чтобы в мэйне избежать переменных, которые бы считали кол-во и пробег...
Тогда погуглю про linq и list
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.02.2017, 17:53
Помогаю со студенческими работами здесь

Вызов метода базового класса игнорируя переопределенный метод в производном классе
Как вызвать метод базового класса игнорируя переопределенный метод в производном классе. PS переопределение метода в производном классе...

Как быть если при перегрузке нужно изменить тип свойства в производном классе?
Здравствуйте, предположим, есть обычный мяч и коробка для него, потом появился специфичный мяч для работы с которым нужно расширить обычную...

Наследование. Как сделать так, чтобы присвоение полей исполнилось только в производном классе?
Здравствуйте. При создании экземпляра DerivedClass instance = new DerivedClass(); С начало выполняется присвоение полям значений в...

Конструктор в производном классе
Всем доброго времени суток! есть класс Строка (CStr) class CStr { protected: int length; char *str; public: CStr(); ...

Не могу перегрузить [] в производном классе
Не могу перегрузить оператор в производном классе class_arr.cpp #include &lt;iostream&gt; #include &quot;IntArray.h&quot; ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru