При наследовании класс родителя возвращает 0

138
27 апреля 2022, 17:30

При вызову Soldier метод Soldier.FindQ() возвращает произведние weight и hight, как и нужно. Но при вызове SoldierNew (потомок) Soldier.FindQ() всегда возвращает 0, из-за чего SoldierNew.FindQ() считает непраивльно. Не понимаю в чем ошибка?!

public class Soldier
{
    private string surname;
    private int height;
    private int weigth;
    protected double q;
    public Soldier(string surname, int height, int weigth)
    {
        this.surname = surname;
        this.height = height;
        this.weigth = weigth;
        q = FindQ();
    }
    public virtual double FindQ()
    {
        return height * weigth;
    }
    public String PrintInfo()
    {
        StringBuilder sb = new StringBuilder();
        sb.Append(' ' + surname + '\n' + 
            "Рост - " + height + '\n' + 
            "Вес - " + weigth + '\n' + 
            "Q - " + FindQ() + '\n');
        return sb.ToString();
    }
public class SoldierNew : Soldier
{
    private Education p;
    public SoldierNew(string surname, int height, int weigth, Education p) : base(surname, height, 
weigth)
    {
        this.p = p;
    }
    public override double FindQ()
    {
        if (p.Equals(Education.higher))
            return 2 * q;
        if (p.Equals(Education.primary))
            return 0.5 * q;
        return q;
    }
}
Answer 1

Когда вы создаёте объект SoldierNew то вы входите в конструктор базового класса и в нём начинаете считать q. Только расчёт идёт вызывая FindQ из наследника, а не из базового класса.

Но там получается вот какой момент: чтобы посчитать q вам надо знать q, а его нет.

По логике вероятно вы ожидаете что-то типа:

public override double FindQ()
{
    q = base.FindQ();
    if (p.Equals(Education.higher))
        return 2 * q;
    if (p.Equals(Education.primary))
        return 0.5 * q;
    return q;
}

Update: Если я правильно понял, то @tym32167 предлагает более правильный вариант:

public override double FindQ()
{
    var baseQ = base.FindQ();
    
    if (p.Equals(Education.higher))
        return 2 * baseQ;
        
    if (p.Equals(Education.primary))
        return 0.5 * baseQ;
    
    return baseQ;
}
READ ALSO
Проблема включения микрофона в программе C#

Проблема включения микрофона в программе C#

я сделал голосового ассистента на Python, но решил, перейти на C#По видеоуроку я написал этот код который должен слушать микрофон и писать цифру...

206
Возвращаемый тип для анонимного метода

Возвращаемый тип для анонимного метода

Есть анонимный метод (выполняет через рефлексию методы объекта)

114
Почему оно не сохраняет?

Почему оно не сохраняет?

Не понимаю почему сохранение не работает, скинул весь скрипт, обратите внимание например на функцию MusicVolumeSet, и в старте на её загрузку, я вроде...

140