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

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

16.02.2017, 13:03. Показов 2880. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru