2014-11-13 2 views
0

В настоящее время у меня есть список, который отображает дату, тип торта и размер. Я хочу добавить стоимость в список, но у меня проблемы. В настоящее время он отображает нуль для стоимости. Стоимость отображается на ярлыке (lblRoundCost). У меня есть базовый класс с именем Cake и два подкласса RoundCake и SquareCake. Я не уверен, если это правильный код для базового класса:Добавление стоимости в ListBox

class Cake 
{ 

    private const int CostOfFoodPerPerson = 25; 
    public int size; 
    private bool chocolateIcing; 
    protected DateTime cakeDate; 
    decimal cost; 

public Cake(int numberOfPeople, bool chocolateIcing, DateTime cakeDate) 
{ 

    this.chocolateIcing = chocolateIcing; 
    Size = size;  
    this.cakeDate = cakeDate; 
    Cost = cost; 
} 

public virtual decimal Cost 
{ 
    get { return cost; } 
    set { cost = value; } 
} 

public virtual int Size 
{ 
    get { return size; } 
    set { size = value; } 
} 

public virtual bool ChocolateIcing 
{ 
    set { chocolateIcing = value; } 
} 

public virtual decimal CalculateCost() 
{ 
    decimal CostOfIcing = 0; 
    if (chocolateIcing) 
    CostOfIcing = (Size * 1.5M) + 10M; 

else 

    CostOfIcing = 0; 
    decimal TotalCost = CostOfIcing + CostOfFoodPerPerson; 
    return TotalCost; 
} 

public DateTime CakeDate 
{ 
    set { cakeDate = value; } 
} 

} 
} 

RoundCake код

class RoundCake : Cake 
{ 

bool fruitOption; 

public RoundCake(int size, bool fruitOption, bool chocolateIcing, DateTime cakeDate) 

: base(size, chocolateIcing, cakeDate) 

{FruitOption = fruitOption;} 

public bool FruitOption 

{ 
    set { fruitOption = value; } 
} 


public override decimal CalculateCost() 
{ 

decimal totalCost; 

if (fruitOption) 

{ 

totalCost = base.CalculateCost(); 
return totalCost + (totalCost * .05M); 
} 

else 

{ 

totalCost = base.CalculateCost() ; 
return totalCost; 
} 
} 

public override string ToString() 
{ 

    return String.Format("{0,-20}{1,2}{2,20}{2,20}", cakeDate.ToShortDateString(), "RC",Size,Cost); 
} 

Form1 кода

private void btnRound_Click_1(object sender, EventArgs e) 
{ 

    lstCake.Items.Add(roundCake); 
} 

roundCake = new RoundCake((int)nudRound.Value, chbFruit.Checked, chbChocoRound.Checked, 
dtpRound.Value.Date); 
lblRoundCost.Text = roundCake.CalculateCost().ToString("c"); 
+0

Ваш код выглядит неполным и несовместимым для загрузки. У вас есть поля, объявленные вне классов и назначений вне методов. – Tim

+0

@Tim Полный код слишком длинный для публикации. Я не уверен, что мне разрешено публиковать все. – Strongbad2143

+0

Опубликовать достаточно, чтобы показать, что вы пытаетесь сделать, вам не нужно публиковать все (и вы не должны), но публикация mish-mash кода не принесет вам никакой пользы, и люди будут иметь труднее время, пытаясь помочь вам. Отправьте базовый класс, класс «RoundCake» и пример того, как вы создаете экземпляр «RoundCake» в качестве стартера, и давайте посмотрим, можем ли мы выяснить эту проблему. – Tim

ответ

0

Причина вы видите 0, потому что вы никогда не присваивает ничего Cost, а значение по умолчанию для decimal равно 0.

Вот что происходит:

В вашей базе конструктора, у вас есть:

Cost = cost; 

Однако cost никогда не инициализируется в классе, и это не прошло через конструктор. Итак, в базе это 0.

То же самое происходит с наследующим классом - Cost никогда не указывается, поэтому он все равно будет 0 (даже если бы не был базовый класс, он все равно был бы 0) ,

Теперь, в этой строке кода:

lblRoundCost.Text = roundCake.CalculateCost().ToString("c"); 

Вы присваивая значение, рассчитанное по CalculateCost() к Label, но вы никогда не сохраняющихся это значение в классе:

public override decimal CalculateCost() 
{ 

    decimal totalCost; 

    if (fruitOption) 
    { 
     totalCost = base.CalculateCost(); 
     return totalCost + (totalCost * .05M); 
    } 
    else 
    { 
     totalCost = base.CalculateCost() ; 
     return totalCost; 
    } 
} 

Вы - , возвращая значение, но не назначая его классу cost. Базовая реализация делает то же самое.

Существует несколько способов решить эту проблему. Вот один (это довольно простой, и быть честным, это имеет немного кода запах для меня, но это будет сервер в качестве примера):

Измените метод CalculateCost() обновить cost поле:

public virtual void CalculateCost() 
{ 

    decimal CostOfIcing = 0; 

    if (chocolateIcing) 
     CostOfIcing = (Size * 1.5M) + 10M; 
    else 
     CostOfIcing = 0; 

    decimal cost = CostOfIcing + CostOfFoodPerPerson; 
} 

Обратите внимание, что это больше не возвращает тип (возможно, он все еще делает это, это действительно сильно зависит от вашего общего дизайна, поэтому выберите путь, который лучше всего подходит для вашего дизайна). Не забудьте также внести изменения в реализацию наследующего класса.

Теперь вам нужно просто вызвать метод CalculateCost() и вы будете иметь стоимость в наличии, и вы можете использовать свойство, чтобы получить стоимость для присвоения Labels или то, что вам нужно, и он будет отображаться в вашем переопределены ToString() метод.

Опять же, есть несколько способов решить эту проблему, и они зависят от сочетания принципов ООП и ваших потребностей в дизайне. Мое основное намерение с этим ответом состояло в том, чтобы продемонстрировать, почему cost показывалось как ноль.

+0

Мне пришлось добавить обратную стоимость, иначе я получаю сообщение об ошибке. Я изменил totalCost на стоимость, и он сработал. Ваш ответ имел большой смысл. Я ценю помощь. Спасибо. – Strongbad2143

+0

@ Strongbad2143 - Добро пожаловать. Счастливое кодирование! – Tim

Смежные вопросы