Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 02.03.2021
Сообщений: 12

Наследник наследует конструктор базового класса

28.04.2022, 19:40. Показов 807. Ответов 3

Студворк — интернет-сервис помощи студентам
В программе стоит первоначальная задача считать количество экземпляров родительского класса и через наследника получить их количество. Но при создании экземпляра наследника наследуется и конструктор базового, поэтому счётчик сбивается.

Пытался найти про это информацию и нашёл только этот:
Для класса Employee базовым является Person, и поэтому класс Employee наследует все те же свойства, методы, поля, которые есть в классе Person. Единственное, что не передается при наследовании, это конструкторы базового класса.
Вот какой код:
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
 
namespace NET_COMP
{
    class Program
    {
        static void Main(string[] args)
        {
            Product product = new Product("Хліб", 15.35, 0.3);
            Product product2 = new Product();
            product2.Name = "Сир";
            product2.Price = 60.80;
            product2.Weight = 0.1;
            Buy buy = new Buy();
            Console.WriteLine(buy.Count);
        }
    }
 
    /* Клас Product, який має три елемент-даних – назва, ціна і вага */
    public class Product {
        private string _name;
        private double _price;
        private double _weight;
        private static int instances;
        public string Name { get { return _name; } set { this._name = value; } }
        public double Price
        {
            get { return _price; }
            set {
                if (value >= 0.0) {
                    this._price = value;
                }
            }
        }
 
        public double Weight
        {
            get { return _weight; }
            set {
                if (value >= 0.0) {
                    this._weight = value;
                }
            }
        }
 
        protected int Instence { get; set; }
 
        public Product(string name, double price, double weight)
        {
            this.Instence = GetInstances();
            this._name = name;
            this._price = price;
            this._weight = weight;
        }
        public Product() : this("", 0.0, 0.0) { }
        static Product() => instances = 0;
        protected int GetInstances() => ++instances;
    }
 
    /* Клас Buy, містить дані про товар, кількість товару, що купується в штуках, про ціну за весь куплений товар і про вагу товару */
    public class Buy : Product {
 
        public Buy() { }
        public int Count { get { return Instence; } }
    }
}
На вывод получаю 3, вместо ожидаемых 2
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.04.2022, 19:40
Ответы с готовыми решениями:

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

Вызов переопределенного метода класса наследника из базового класса
Предположим есть два класа: public class A { /* ... некая дополнительная реализация.... */ ...

Как под экземпляр базового класса можно выделить память класса наследник?
На сколько я понял под экземпляр базового класса мы можем выделить память место как для класса наследника... Получается мы выделяем памяти...

3
2395 / 1924 / 763
Регистрация: 27.07.2012
Сообщений: 5,569
28.04.2022, 21:27
Более кривой реализации сложно было придумать, конечно. Но если на то пошло, то создавая объект наследника вы создаёте в его лице и объект базового класса, что и указывает счётчик. Можно, конечно, ввести в конструктор базового класса доп.флаг, который бы указывал, создаётся ли объект непосредственно базового класса или наследника. Тот ещё костыль, но если уж так надо...
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class Product
{
    private Product(bool derived)
    {
        if (!derived)
            ++Instances;
    }
 
    public Product(string name, bool derived = false) : this(derived) { }
 
    public static int Instances { get; private set; }
}
 
class Buy : Product
{
    public Buy(string name) : base(name, true) {}
}
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
29.04.2022, 15:09
Цитата Сообщение от Osborne Посмотреть сообщение
На вывод получаю 3, вместо ожидаемых 2
Не понятно, почему ожидалось 2.
Наследование — это отношение "является".
Согласно вашей иерархии, тип Buy является типом Product, следовательно экземпляр Buy так же является экземпляром Product.
Все правильно считается.
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
29.04.2022, 20:24
Так у тебя же счетчиком является статическое поле. Естественно что оно одно на всех.
Хочешь костылить костыли делай так:
C#
1
2
3
4
5
6
7
private static Dictionary<Type,int> Instances = new();
 
public Product()
{
     Instances[this.GetType()] += 1;
     this.Instance = Instances[this.GetType()];
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.04.2022, 20:24
Помогаю со студенческими работами здесь

Конструктор базового класса c#
Дано class B:A { bool i; B(A a, bool s) { i = s; } }

Конструктор базового класса
вот код наследника namespace Inheritance1_1 { class SalePurchase : Purchase { public SalePurchase(string...

Создать конструктор производного и базового класса с переменными
Помогите доделать задание, нужно создать конструктор производного и базового класса с переменными и из конструктора производного класса...

Передача значения из конструктора производного класса в конструктор базового
Всем привет, такой вопрос: есть ли возможность передать значение из производного конструктора в базовый таким образом: static...

Производный класс не наследует свойство базового
Для того, чтобы TableLayoutPanel не мерцал, создал класс, который наследует TableLayoutPanel и во конструкторе прописал this.DoubleBuffered...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита "ПричинаСписания". . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Программное заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru